TranslatePress – Translate Multilingual sites - Version 1.4.9

Version Description

  • Fixed incompatibility with custom code for changing flags
  • Fixed some pages not being translated due to incorrectly encoded character
  • Fixed some images missing when automatic translation is on
Download this release

Release Info

Developer madalin.ungureanu
Plugin Icon 128x128 TranslatePress – Translate Multilingual sites
Version 1.4.9
Comparing to
See all releases

Code changes from version 1.4.8 to 1.4.9

assets/css/trp-editor-style.css DELETED
@@ -1,494 +0,0 @@
1
-
2
-
3
- body{
4
- margin: 0px;
5
- font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
6
- }
7
-
8
- #trp-editor{
9
- margin-left: 350px;
10
- position: fixed;
11
- width: 100%;
12
- height: 100%;
13
- }
14
-
15
- #trp-controls{
16
- width: 348px;
17
- position: fixed;
18
- top: 0;
19
- bottom: 0;
20
- left: 0;
21
- border-right: 2px solid #ddd;
22
- background: #eee;
23
- }
24
-
25
- .trp-controls-container{
26
- height: 100%;
27
- overflow-x: auto;
28
- }
29
-
30
-
31
- #trp-save-container{
32
- float: right;
33
- }
34
-
35
- .trp-controls-section{
36
- background: #fff;
37
- color: #555d66;
38
- cursor: default;
39
- border: none;
40
- border-bottom: 1px solid #ddd;
41
- border-top: 1px solid #ddd;
42
- margin-bottom: 15px;
43
- }
44
-
45
- .trp-controls-section-content{
46
- padding: 12px;
47
- }
48
-
49
- #trp-upsell-section h3,
50
- #trp-upsell-section p{
51
- text-align: center;
52
- }
53
-
54
- #trp-upsell-section .button-primary{
55
- min-width:200px;
56
- }
57
-
58
-
59
- #trp-unsaved-changes-warning-message{
60
- color: #dc3232;
61
- }
62
-
63
- .ui-resizable-handle {
64
- position: absolute;
65
- font-size: 1px;
66
- display: block;
67
- z-index: 50;
68
- }
69
-
70
- .ui-resizable-handle:active {
71
- background-color: #676767;
72
- }
73
-
74
- .ui-resizable-disabled .ui-resizable-handle,
75
- .ui-resizable-autohide .ui-resizable-handle {
76
- display: none;
77
- }
78
- .ui-resizable-e {
79
- cursor: e-resize;
80
- width: 7px;
81
- right: -2px;
82
- top: 0;
83
- height: 100%;
84
- }
85
-
86
- #trp-controls-close{
87
- cursor: pointer;
88
- font: 400 26px/40px dashicons;
89
- font-weight: bold;
90
- display: inline-block;
91
- width: 45px;
92
- height: 41px;
93
- background: #eee;
94
- border: none;
95
- border-top: 4px solid #eee;
96
- border-right: 1px solid #ddd;
97
- color: #444;
98
- text-align: center;
99
- -webkit-transition: color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;
100
- transition: color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;
101
- -webkit-box-sizing: content-box;
102
- -moz-box-sizing: content-box;
103
- box-sizing: content-box;
104
- text-decoration: none;
105
- }
106
-
107
- #trp-controls-close:after{
108
- content: "\f335";
109
- }
110
-
111
- #trp-controls-close:focus,
112
- #trp-controls-close:hover{
113
- background: #fff;
114
- color: #0073aa;
115
- border-top-color: #0073aa;
116
- outline: none;
117
- -webkit-box-shadow: none;
118
- box-shadow: none;
119
- }
120
-
121
- #trp-preview{
122
- position: absolute;
123
- left: 0;
124
- right: 350px;
125
- height: 100%;
126
- }
127
-
128
- html[dir="rtl"] #trp-preview{
129
- left: 350px !important;
130
- right: 0px !important;
131
- }
132
-
133
- iframe#trp-preview-iframe {
134
- position: absolute;
135
- height: 100%;
136
- width: 100%;
137
- border-width: 0px;
138
- }
139
-
140
- #trp-language-switch-form{
141
- display: inline;
142
- }
143
-
144
- #trp-language-select{
145
- width: 100%;
146
- margin-bottom: 30px;
147
- font-size: 14px;
148
- padding: 3px;
149
- }
150
-
151
- .string-selector-description{
152
- font-size: 12px;
153
- }
154
-
155
-
156
- /*
157
- View as Dropdown
158
- */
159
- #trp-view-as{
160
- clear:both;
161
- padding-top:15px;
162
- }
163
-
164
- #trp-view-as-description{
165
- padding-bottom: 10px;
166
- color: black;
167
- }
168
-
169
- #trp-view-as-select{
170
- width: 100%;
171
- margin-bottom: 30px;
172
- font-size: 14px;
173
- padding: 3px;
174
- }
175
-
176
-
177
-
178
-
179
- /*
180
- String list
181
- */
182
-
183
- #trp-string-categories{
184
- width: 100% /*!important*/;
185
- margin-bottom: 10px;
186
- font-size: 14px;
187
- padding: 3px;
188
- }
189
-
190
- span.select2-container{
191
- margin-bottom: 10px;
192
- /*width: 100% !important;*/
193
- }
194
-
195
- #trp-lists{
196
- margin-botton: 10px;
197
- }
198
-
199
-
200
- /*
201
- Translation Editors
202
- */
203
-
204
- #trp-previous{
205
- float: left;
206
- }
207
- #trp-next{
208
- float: right;
209
- }
210
- .trp-toggle-languages {
211
- margin-top: 10px;
212
- margin-bottom: 10px;
213
- }
214
-
215
- .trp-toggle-languages span,
216
- .trp-next-previous-buttons {
217
- cursor: pointer;
218
- }
219
-
220
- .trp-language-name{
221
- padding-bottom: 10px;
222
- color: black;
223
- }
224
-
225
- .trp-language-text{
226
- padding-right: 9px;
227
- padding-bottom: 15px;
228
- }
229
-
230
- .trp-language-text textarea{
231
- height: 80px;
232
- font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
233
- font-size: 14px;
234
- max-width: 100%;
235
- min-width: 100%;
236
- width: 100%;
237
- padding: 3px;
238
- border: 1px solid #aaa;
239
- border-radius:3px;
240
- }
241
-
242
- .trp-language-text textarea[readonly="readonly"]{
243
- background: #EBEBE4;
244
- border: 1px solid #aaa;
245
- outline-width: 0;
246
- }
247
-
248
- .trp-discard-changes{
249
- color: darkgrey;
250
- font-size: 11px;
251
- float: right;
252
- user-select: none;
253
- }
254
-
255
- .trp-unsaved-changes .trp-discard-changes{
256
- color: #a00;
257
- cursor: pointer;
258
- text-decoration: underline;
259
- }
260
- .trp-unsaved-changes .trp-discard-changes:hover{
261
- color: #dc3232;
262
- cursor: pointer;
263
- }
264
-
265
- #trp-next-previous {
266
- margin: 5px 0 10px 0;
267
- }
268
-
269
- .trp-toggle-languages span,
270
- .trp-next-previous-buttons span {
271
- font-size: initial;
272
- }
273
-
274
- .trp-toggle-languages span,
275
- .trp-next-previous-buttons {
276
- display: inline-block;
277
- text-decoration: none;
278
- font-size: 13px;
279
- line-height: 26px;
280
- height: 28px;
281
- margin: 0;
282
- padding: 0 10px 1px;
283
- cursor: pointer;
284
- border-width: 1px;
285
- border-style: solid;
286
- -webkit-appearance: none;
287
- -webkit-border-radius: 3px;
288
- border-radius: 3px;
289
- white-space: nowrap;
290
- -webkit-box-sizing: border-box;
291
- -moz-box-sizing: border-box;
292
- box-sizing: border-box;
293
- min-width: 85px;
294
- }
295
-
296
- .trp-toggle-languages span,
297
- .trp-next-previous-buttons {
298
- color: #555;
299
- border-color: #cccccc;
300
- background: #f7f7f7;
301
- -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
302
- box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
303
- vertical-align: top;
304
- }
305
-
306
- .trp-toggle-languages span,
307
- .trp-next-previous-buttons {
308
- vertical-align: baseline;
309
- }
310
-
311
- .trp-toggle-languages span:hover,
312
- .trp-next-previous-buttons:hover,
313
- .trp-next-previous-buttons:focus {
314
- background: #fafafa;
315
- border-color: #999;
316
- color: #222;
317
- }
318
-
319
- .trp-toggle-languages.trp-toggle-languages-active span:hover {
320
- background: #eee;
321
- }
322
-
323
- .trp-toggle-languages span,
324
- .trp-next-previous-buttons:focus {
325
- -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.2);
326
- box-shadow: 1px 1px 1px rgba(0,0,0,.2);
327
- }
328
-
329
- .trp-toggle-languages.trp-toggle-languages-active span,
330
- .trp-next-previous-buttons:active {
331
- background: #eee;
332
- border-color: #999;
333
- color: #333;
334
- -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
335
- box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
336
- }
337
-
338
- .trp-toggle-languages {
339
- -webkit-touch-callout: none;
340
- -webkit-user-select: none;
341
- -khtml-user-select: none;
342
- -moz-user-select: none;
343
- -ms-user-select: none;
344
- user-select: none;
345
- }
346
-
347
- #trp-hide-all-languages,
348
- .trp-other-language{
349
- display: none;
350
- }
351
-
352
- #trp-save, #trp-save-gettext{
353
- margin-right: 10px;
354
- margin-top: 9px;
355
- margin-left: 10px;
356
- background: #0085ba;
357
- border-color: #0073aa #006799 #006799;
358
- -webkit-box-shadow: 0 1px 0 #006799;
359
- box-shadow: 0 1px 0 #006799;
360
- color: #fff;
361
- text-decoration: none;
362
- text-shadow: 0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;
363
- display: inline-block;
364
- font-size: 13px;
365
- height: 28px;
366
- padding: 0 10px 1px;
367
- cursor: pointer;
368
- border-width: 1px;
369
- border-style: solid;
370
- -webkit-appearance: none;
371
- -webkit-border-radius: 3px;
372
- border-radius: 3px;
373
- white-space: nowrap;
374
- -webkit-box-sizing: border-box;
375
- -moz-box-sizing: border-box;
376
- box-sizing: border-box;
377
- font-family: inherit;
378
- }
379
-
380
- #trp-save:hover, #trp-save-gettext:hover {
381
- background: #008ec2;
382
- border-color: #006799;
383
- color: #fff;
384
- }
385
-
386
- #trp-save:active, #trp-save-gettext:active {
387
- background: #0073aa;
388
- border-color: #006799;
389
- -webkit-box-shadow: inset 0 2px 0 #006799;
390
- box-shadow: inset 0 2px 0 #006799;
391
- }
392
-
393
-
394
- #trp-translation-saved {
395
- padding-left: 20px;
396
- color: #008000;
397
- font-size: 14px;
398
- display:none;
399
- }
400
-
401
- /*
402
- * Loading animation
403
- */
404
- .trp-ajax-loader {
405
- margin-bottom: -6px;
406
- margin-left:20px;
407
- display: inline-block;
408
- z-index: 50;
409
- -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=1, StartColorStr='#E57EB149', EndColorStr='#E57EB149')";
410
- filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#E57EB149', EndColorStr='#E57EB149');
411
- zoom: 1!important;
412
- }
413
-
414
- .trp-ajax-loader .trp-spinner {
415
- width: 15px;
416
- height: 15px;
417
- border: 3px solid #a1b9e6;
418
- border-radius: 50%;
419
- border-left-color: transparent;
420
- border-right-color: transparent;
421
- -webkit-animation: spin 1s linear infinite;
422
- animation: spin 1s linear infinite;
423
-
424
- }
425
-
426
- @-webkit-keyframes
427
- spin {
428
- 100% {
429
- -webkit-transform: rotate(360deg);
430
- transform: rotate(360deg)
431
- }
432
- }
433
-
434
- @keyframes
435
- spin {
436
- 100% {
437
- -moz-transform: rotate(360deg);
438
- -ms-transform: rotate(360deg);
439
- -o-transform: rotate(360deg);
440
- transform: rotate(360deg)
441
- }
442
- }
443
-
444
- #trp-preview.trp-still-loading-strings:before{
445
- position: absolute; /* Sit on top of the page content */
446
- width: 100%; /* Full width (cover the whole page) */
447
- height: 30px; /* Full height (cover the whole page) */
448
- line-height:30px;
449
- top: 0;
450
- left: 0;
451
- right: 0;
452
- background-color: rgba(40,177,255,0.8); /* Black background with opacity */
453
- z-index: 200; /* Specify a stack order in case you're using a different order for other elements */
454
- cursor: pointer; /* Add a pointer on hover */
455
- content:'The strings are not yet ready for translation. Try again in a moment...';
456
- color:#fff;
457
- text-align:center;
458
- }
459
- /*
460
- * Select 2 Overlay in front-end
461
- */
462
-
463
- .select2-selection.select2-selection--single{
464
- outline: 0;
465
- }
466
-
467
- #trp_select2_overlay{
468
- display: none;
469
- position: absolute;
470
- top: 0;
471
- left: 0;
472
- width: 100%;
473
- height: 100%;
474
- background-color: #000;
475
- filter:alpha(opacity=50);
476
- -moz-opacity:0.5;
477
- -khtml-opacity: 0.5;
478
- opacity: 0.5;
479
- z-index: 1000;
480
- }
481
-
482
- .select2-container{
483
- z-index: 1051;
484
- }
485
-
486
- #trp-view-as .select2-container{
487
- z-index: 999;
488
- }
489
-
490
- .select2-container--default .select2-results > .select2-results__options,
491
- .select2-container--default .select2-results > .select2-results__options,
492
- .select2-results{
493
- max-height: 400px !important;
494
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/css/trp-jquery-ui.css DELETED
@@ -1,1312 +0,0 @@
1
- /*! jQuery UI - v1.12.1 - 2016-09-14
2
- * http://jqueryui.com
3
- * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
4
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
5
- * Copyright jQuery Foundation and other contributors; Licensed MIT */
6
-
7
- /* Layout helpers
8
- ----------------------------------*/
9
- .ui-helper-hidden {
10
- display: none;
11
- }
12
- .ui-helper-hidden-accessible {
13
- border: 0;
14
- clip: rect(0 0 0 0);
15
- height: 1px;
16
- margin: -1px;
17
- overflow: hidden;
18
- padding: 0;
19
- position: absolute;
20
- width: 1px;
21
- }
22
- .ui-helper-reset {
23
- margin: 0;
24
- padding: 0;
25
- border: 0;
26
- outline: 0;
27
- line-height: 1.3;
28
- text-decoration: none;
29
- font-size: 100%;
30
- list-style: none;
31
- }
32
- .ui-helper-clearfix:before,
33
- .ui-helper-clearfix:after {
34
- content: "";
35
- display: table;
36
- border-collapse: collapse;
37
- }
38
- .ui-helper-clearfix:after {
39
- clear: both;
40
- }
41
- .ui-helper-zfix {
42
- width: 100%;
43
- height: 100%;
44
- top: 0;
45
- left: 0;
46
- position: absolute;
47
- opacity: 0;
48
- filter:Alpha(Opacity=0); /* support: IE8 */
49
- }
50
-
51
- .ui-front {
52
- z-index: 100;
53
- }
54
-
55
-
56
- /* Interaction Cues
57
- ----------------------------------*/
58
- .ui-state-disabled {
59
- cursor: default !important;
60
- pointer-events: none;
61
- }
62
-
63
-
64
- /* Icons
65
- ----------------------------------*/
66
- .ui-icon {
67
- display: inline-block;
68
- vertical-align: middle;
69
- margin-top: -.25em;
70
- position: relative;
71
- text-indent: -99999px;
72
- overflow: hidden;
73
- background-repeat: no-repeat;
74
- }
75
-
76
- .ui-widget-icon-block {
77
- left: 50%;
78
- margin-left: -8px;
79
- display: block;
80
- }
81
-
82
- /* Misc visuals
83
- ----------------------------------*/
84
-
85
- /* Overlays */
86
- .ui-widget-overlay {
87
- position: fixed;
88
- top: 0;
89
- left: 0;
90
- width: 100%;
91
- height: 100%;
92
- }
93
- .ui-accordion .ui-accordion-header {
94
- display: block;
95
- cursor: pointer;
96
- position: relative;
97
- margin: 2px 0 0 0;
98
- padding: .5em .5em .5em .7em;
99
- font-size: 100%;
100
- }
101
- .ui-accordion .ui-accordion-content {
102
- padding: 1em 2.2em;
103
- border-top: 0;
104
- overflow: auto;
105
- }
106
- .ui-autocomplete {
107
- position: absolute;
108
- top: 0;
109
- left: 0;
110
- cursor: default;
111
- }
112
- .ui-menu {
113
- list-style: none;
114
- padding: 0;
115
- margin: 0;
116
- display: block;
117
- outline: 0;
118
- }
119
- .ui-menu .ui-menu {
120
- position: absolute;
121
- }
122
- .ui-menu .ui-menu-item {
123
- margin: 0;
124
- cursor: pointer;
125
- /* support: IE10, see #8844 */
126
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
127
- }
128
- .ui-menu .ui-menu-item-wrapper {
129
- position: relative;
130
- padding: 3px 1em 3px .4em;
131
- }
132
- .ui-menu .ui-menu-divider {
133
- margin: 5px 0;
134
- height: 0;
135
- font-size: 0;
136
- line-height: 0;
137
- border-width: 1px 0 0 0;
138
- }
139
- .ui-menu .ui-state-focus,
140
- .ui-menu .ui-state-active {
141
- margin: -1px;
142
- }
143
-
144
- /* icon support */
145
- .ui-menu-icons {
146
- position: relative;
147
- }
148
- .ui-menu-icons .ui-menu-item-wrapper {
149
- padding-left: 2em;
150
- }
151
-
152
- /* left-aligned */
153
- .ui-menu .ui-icon {
154
- position: absolute;
155
- top: 0;
156
- bottom: 0;
157
- left: .2em;
158
- margin: auto 0;
159
- }
160
-
161
- /* right-aligned */
162
- .ui-menu .ui-menu-icon {
163
- left: auto;
164
- right: 0;
165
- }
166
- .ui-button {
167
- padding: .4em 1em;
168
- display: inline-block;
169
- position: relative;
170
- line-height: normal;
171
- margin-right: .1em;
172
- cursor: pointer;
173
- vertical-align: middle;
174
- text-align: center;
175
- -webkit-user-select: none;
176
- -moz-user-select: none;
177
- -ms-user-select: none;
178
- user-select: none;
179
-
180
- /* Support: IE <= 11 */
181
- overflow: visible;
182
- }
183
-
184
- .ui-button,
185
- .ui-button:link,
186
- .ui-button:visited,
187
- .ui-button:hover,
188
- .ui-button:active {
189
- text-decoration: none;
190
- }
191
-
192
- /* to make room for the icon, a width needs to be set here */
193
- .ui-button-icon-only {
194
- width: 2em;
195
- box-sizing: border-box;
196
- text-indent: -9999px;
197
- white-space: nowrap;
198
- }
199
-
200
- /* no icon support for input elements */
201
- input.ui-button.ui-button-icon-only {
202
- text-indent: 0;
203
- }
204
-
205
- /* button icon element(s) */
206
- .ui-button-icon-only .ui-icon {
207
- position: absolute;
208
- top: 50%;
209
- left: 50%;
210
- margin-top: -8px;
211
- margin-left: -8px;
212
- }
213
-
214
- .ui-button.ui-icon-notext .ui-icon {
215
- padding: 0;
216
- width: 2.1em;
217
- height: 2.1em;
218
- text-indent: -9999px;
219
- white-space: nowrap;
220
-
221
- }
222
-
223
- input.ui-button.ui-icon-notext .ui-icon {
224
- width: auto;
225
- height: auto;
226
- text-indent: 0;
227
- white-space: normal;
228
- padding: .4em 1em;
229
- }
230
-
231
- /* workarounds */
232
- /* Support: Firefox 5 - 40 */
233
- input.ui-button::-moz-focus-inner,
234
- button.ui-button::-moz-focus-inner {
235
- border: 0;
236
- padding: 0;
237
- }
238
- .ui-controlgroup {
239
- vertical-align: middle;
240
- display: inline-block;
241
- }
242
- .ui-controlgroup > .ui-controlgroup-item {
243
- float: left;
244
- margin-left: 0;
245
- margin-right: 0;
246
- }
247
- .ui-controlgroup > .ui-controlgroup-item:focus,
248
- .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
249
- z-index: 9999;
250
- }
251
- .ui-controlgroup-vertical > .ui-controlgroup-item {
252
- display: block;
253
- float: none;
254
- width: 100%;
255
- margin-top: 0;
256
- margin-bottom: 0;
257
- text-align: left;
258
- }
259
- .ui-controlgroup-vertical .ui-controlgroup-item {
260
- box-sizing: border-box;
261
- }
262
- .ui-controlgroup .ui-controlgroup-label {
263
- padding: .4em 1em;
264
- }
265
- .ui-controlgroup .ui-controlgroup-label span {
266
- font-size: 80%;
267
- }
268
- .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
269
- border-left: none;
270
- }
271
- .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
272
- border-top: none;
273
- }
274
- .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
275
- border-right: none;
276
- }
277
- .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
278
- border-bottom: none;
279
- }
280
-
281
- /* Spinner specific style fixes */
282
- .ui-controlgroup-vertical .ui-spinner-input {
283
-
284
- /* Support: IE8 only, Android < 4.4 only */
285
- width: 75%;
286
- width: calc( 100% - 2.4em );
287
- }
288
- .ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
289
- border-top-style: solid;
290
- }
291
-
292
- .ui-checkboxradio-label .ui-icon-background {
293
- box-shadow: inset 1px 1px 1px #ccc;
294
- border-radius: .12em;
295
- border: none;
296
- }
297
- .ui-checkboxradio-radio-label .ui-icon-background {
298
- width: 16px;
299
- height: 16px;
300
- border-radius: 1em;
301
- overflow: visible;
302
- border: none;
303
- }
304
- .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
305
- .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
306
- background-image: none;
307
- width: 8px;
308
- height: 8px;
309
- border-width: 4px;
310
- border-style: solid;
311
- }
312
- .ui-checkboxradio-disabled {
313
- pointer-events: none;
314
- }
315
- .ui-datepicker {
316
- width: 17em;
317
- padding: .2em .2em 0;
318
- display: none;
319
- }
320
- .ui-datepicker .ui-datepicker-header {
321
- position: relative;
322
- padding: .2em 0;
323
- }
324
- .ui-datepicker .ui-datepicker-prev,
325
- .ui-datepicker .ui-datepicker-next {
326
- position: absolute;
327
- top: 2px;
328
- width: 1.8em;
329
- height: 1.8em;
330
- }
331
- .ui-datepicker .ui-datepicker-prev-hover,
332
- .ui-datepicker .ui-datepicker-next-hover {
333
- top: 1px;
334
- }
335
- .ui-datepicker .ui-datepicker-prev {
336
- left: 2px;
337
- }
338
- .ui-datepicker .ui-datepicker-next {
339
- right: 2px;
340
- }
341
- .ui-datepicker .ui-datepicker-prev-hover {
342
- left: 1px;
343
- }
344
- .ui-datepicker .ui-datepicker-next-hover {
345
- right: 1px;
346
- }
347
- .ui-datepicker .ui-datepicker-prev span,
348
- .ui-datepicker .ui-datepicker-next span {
349
- display: block;
350
- position: absolute;
351
- left: 50%;
352
- margin-left: -8px;
353
- top: 50%;
354
- margin-top: -8px;
355
- }
356
- .ui-datepicker .ui-datepicker-title {
357
- margin: 0 2.3em;
358
- line-height: 1.8em;
359
- text-align: center;
360
- }
361
- .ui-datepicker .ui-datepicker-title select {
362
- font-size: 1em;
363
- margin: 1px 0;
364
- }
365
- .ui-datepicker select.ui-datepicker-month,
366
- .ui-datepicker select.ui-datepicker-year {
367
- width: 45%;
368
- }
369
- .ui-datepicker table {
370
- width: 100%;
371
- font-size: .9em;
372
- border-collapse: collapse;
373
- margin: 0 0 .4em;
374
- }
375
- .ui-datepicker th {
376
- padding: .7em .3em;
377
- text-align: center;
378
- font-weight: bold;
379
- border: 0;
380
- }
381
- .ui-datepicker td {
382
- border: 0;
383
- padding: 1px;
384
- }
385
- .ui-datepicker td span,
386
- .ui-datepicker td a {
387
- display: block;
388
- padding: .2em;
389
- text-align: right;
390
- text-decoration: none;
391
- }
392
- .ui-datepicker .ui-datepicker-buttonpane {
393
- background-image: none;
394
- margin: .7em 0 0 0;
395
- padding: 0 .2em;
396
- border-left: 0;
397
- border-right: 0;
398
- border-bottom: 0;
399
- }
400
- .ui-datepicker .ui-datepicker-buttonpane button {
401
- float: right;
402
- margin: .5em .2em .4em;
403
- cursor: pointer;
404
- padding: .2em .6em .3em .6em;
405
- width: auto;
406
- overflow: visible;
407
- }
408
- .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
409
- float: left;
410
- }
411
-
412
- /* with multiple calendars */
413
- .ui-datepicker.ui-datepicker-multi {
414
- width: auto;
415
- }
416
- .ui-datepicker-multi .ui-datepicker-group {
417
- float: left;
418
- }
419
- .ui-datepicker-multi .ui-datepicker-group table {
420
- width: 95%;
421
- margin: 0 auto .4em;
422
- }
423
- .ui-datepicker-multi-2 .ui-datepicker-group {
424
- width: 50%;
425
- }
426
- .ui-datepicker-multi-3 .ui-datepicker-group {
427
- width: 33.3%;
428
- }
429
- .ui-datepicker-multi-4 .ui-datepicker-group {
430
- width: 25%;
431
- }
432
- .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
433
- .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
434
- border-left-width: 0;
435
- }
436
- .ui-datepicker-multi .ui-datepicker-buttonpane {
437
- clear: left;
438
- }
439
- .ui-datepicker-row-break {
440
- clear: both;
441
- width: 100%;
442
- font-size: 0;
443
- }
444
-
445
- /* RTL support */
446
- .ui-datepicker-rtl {
447
- direction: rtl;
448
- }
449
- .ui-datepicker-rtl .ui-datepicker-prev {
450
- right: 2px;
451
- left: auto;
452
- }
453
- .ui-datepicker-rtl .ui-datepicker-next {
454
- left: 2px;
455
- right: auto;
456
- }
457
- .ui-datepicker-rtl .ui-datepicker-prev:hover {
458
- right: 1px;
459
- left: auto;
460
- }
461
- .ui-datepicker-rtl .ui-datepicker-next:hover {
462
- left: 1px;
463
- right: auto;
464
- }
465
- .ui-datepicker-rtl .ui-datepicker-buttonpane {
466
- clear: right;
467
- }
468
- .ui-datepicker-rtl .ui-datepicker-buttonpane button {
469
- float: left;
470
- }
471
- .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
472
- .ui-datepicker-rtl .ui-datepicker-group {
473
- float: right;
474
- }
475
- .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
476
- .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
477
- border-right-width: 0;
478
- border-left-width: 1px;
479
- }
480
-
481
- /* Icons */
482
- .ui-datepicker .ui-icon {
483
- display: block;
484
- text-indent: -99999px;
485
- overflow: hidden;
486
- background-repeat: no-repeat;
487
- left: .5em;
488
- top: .3em;
489
- }
490
- .ui-dialog {
491
- position: absolute;
492
- top: 0;
493
- left: 0;
494
- padding: .2em;
495
- outline: 0;
496
- }
497
- .ui-dialog .ui-dialog-titlebar {
498
- padding: .4em 1em;
499
- position: relative;
500
- }
501
- .ui-dialog .ui-dialog-title {
502
- float: left;
503
- margin: .1em 0;
504
- white-space: nowrap;
505
- width: 90%;
506
- overflow: hidden;
507
- text-overflow: ellipsis;
508
- }
509
- .ui-dialog .ui-dialog-titlebar-close {
510
- position: absolute;
511
- right: .3em;
512
- top: 50%;
513
- width: 20px;
514
- margin: -10px 0 0 0;
515
- padding: 1px;
516
- height: 20px;
517
- }
518
- .ui-dialog .ui-dialog-content {
519
- position: relative;
520
- border: 0;
521
- padding: .5em 1em;
522
- background: none;
523
- overflow: auto;
524
- }
525
- .ui-dialog .ui-dialog-buttonpane {
526
- text-align: left;
527
- border-width: 1px 0 0 0;
528
- background-image: none;
529
- margin-top: .5em;
530
- padding: .3em 1em .5em .4em;
531
- }
532
- .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
533
- float: right;
534
- }
535
- .ui-dialog .ui-dialog-buttonpane button {
536
- margin: .5em .4em .5em 0;
537
- cursor: pointer;
538
- }
539
- .ui-dialog .ui-resizable-n {
540
- height: 2px;
541
- top: 0;
542
- }
543
- .ui-dialog .ui-resizable-e {
544
- width: 2px;
545
- right: 0;
546
- }
547
- .ui-dialog .ui-resizable-s {
548
- height: 2px;
549
- bottom: 0;
550
- }
551
- .ui-dialog .ui-resizable-w {
552
- width: 2px;
553
- left: 0;
554
- }
555
- .ui-dialog .ui-resizable-se,
556
- .ui-dialog .ui-resizable-sw,
557
- .ui-dialog .ui-resizable-ne,
558
- .ui-dialog .ui-resizable-nw {
559
- width: 7px;
560
- height: 7px;
561
- }
562
- .ui-dialog .ui-resizable-se {
563
- right: 0;
564
- bottom: 0;
565
- }
566
- .ui-dialog .ui-resizable-sw {
567
- left: 0;
568
- bottom: 0;
569
- }
570
- .ui-dialog .ui-resizable-ne {
571
- right: 0;
572
- top: 0;
573
- }
574
- .ui-dialog .ui-resizable-nw {
575
- left: 0;
576
- top: 0;
577
- }
578
- .ui-draggable .ui-dialog-titlebar {
579
- cursor: move;
580
- }
581
- .ui-draggable-handle {
582
- -ms-touch-action: none;
583
- touch-action: none;
584
- }
585
- .ui-resizable {
586
- position: relative;
587
- }
588
- .ui-resizable-handle {
589
- position: absolute;
590
- font-size: 0.1px;
591
- display: block;
592
- -ms-touch-action: none;
593
- touch-action: none;
594
- }
595
- .ui-resizable-disabled .ui-resizable-handle,
596
- .ui-resizable-autohide .ui-resizable-handle {
597
- display: none;
598
- }
599
- .ui-resizable-n {
600
- cursor: n-resize;
601
- height: 7px;
602
- width: 100%;
603
- top: -5px;
604
- left: 0;
605
- }
606
- .ui-resizable-s {
607
- cursor: s-resize;
608
- height: 7px;
609
- width: 100%;
610
- bottom: -5px;
611
- left: 0;
612
- }
613
- .ui-resizable-e {
614
- cursor: e-resize;
615
- width: 7px;
616
- right: -5px;
617
- top: 0;
618
- height: 100%;
619
- }
620
- .ui-resizable-w {
621
- cursor: w-resize;
622
- width: 7px;
623
- left: -5px;
624
- top: 0;
625
- height: 100%;
626
- }
627
- .ui-resizable-se {
628
- cursor: se-resize;
629
- width: 12px;
630
- height: 12px;
631
- right: 1px;
632
- bottom: 1px;
633
- }
634
- .ui-resizable-sw {
635
- cursor: sw-resize;
636
- width: 9px;
637
- height: 9px;
638
- left: -5px;
639
- bottom: -5px;
640
- }
641
- .ui-resizable-nw {
642
- cursor: nw-resize;
643
- width: 9px;
644
- height: 9px;
645
- left: -5px;
646
- top: -5px;
647
- }
648
- .ui-resizable-ne {
649
- cursor: ne-resize;
650
- width: 9px;
651
- height: 9px;
652
- right: -5px;
653
- top: -5px;
654
- }
655
- .ui-progressbar {
656
- height: 2em;
657
- text-align: left;
658
- overflow: hidden;
659
- }
660
- .ui-progressbar .ui-progressbar-value {
661
- margin: -1px;
662
- height: 100%;
663
- }
664
- .ui-progressbar .ui-progressbar-overlay {
665
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
666
- height: 100%;
667
- filter: alpha(opacity=25); /* support: IE8 */
668
- opacity: 0.25;
669
- }
670
- .ui-progressbar-indeterminate .ui-progressbar-value {
671
- background-image: none;
672
- }
673
- .ui-selectable {
674
- -ms-touch-action: none;
675
- touch-action: none;
676
- }
677
- .ui-selectable-helper {
678
- position: absolute;
679
- z-index: 100;
680
- border: 1px dotted black;
681
- }
682
- .ui-selectmenu-menu {
683
- padding: 0;
684
- margin: 0;
685
- position: absolute;
686
- top: 0;
687
- left: 0;
688
- display: none;
689
- }
690
- .ui-selectmenu-menu .ui-menu {
691
- overflow: auto;
692
- overflow-x: hidden;
693
- padding-bottom: 1px;
694
- }
695
- .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
696
- font-size: 1em;
697
- font-weight: bold;
698
- line-height: 1.5;
699
- padding: 2px 0.4em;
700
- margin: 0.5em 0 0 0;
701
- height: auto;
702
- border: 0;
703
- }
704
- .ui-selectmenu-open {
705
- display: block;
706
- }
707
- .ui-selectmenu-text {
708
- display: block;
709
- margin-right: 20px;
710
- overflow: hidden;
711
- text-overflow: ellipsis;
712
- }
713
- .ui-selectmenu-button.ui-button {
714
- text-align: left;
715
- white-space: nowrap;
716
- width: 14em;
717
- }
718
- .ui-selectmenu-icon.ui-icon {
719
- float: right;
720
- margin-top: 0;
721
- }
722
- .ui-slider {
723
- position: relative;
724
- text-align: left;
725
- }
726
- .ui-slider .ui-slider-handle {
727
- position: absolute;
728
- z-index: 2;
729
- width: 1.2em;
730
- height: 1.2em;
731
- cursor: default;
732
- -ms-touch-action: none;
733
- touch-action: none;
734
- }
735
- .ui-slider .ui-slider-range {
736
- position: absolute;
737
- z-index: 1;
738
- font-size: .7em;
739
- display: block;
740
- border: 0;
741
- background-position: 0 0;
742
- }
743
-
744
- /* support: IE8 - See #6727 */
745
- .ui-slider.ui-state-disabled .ui-slider-handle,
746
- .ui-slider.ui-state-disabled .ui-slider-range {
747
- filter: inherit;
748
- }
749
-
750
- .ui-slider-horizontal {
751
- height: .8em;
752
- }
753
- .ui-slider-horizontal .ui-slider-handle {
754
- top: -.3em;
755
- margin-left: -.6em;
756
- }
757
- .ui-slider-horizontal .ui-slider-range {
758
- top: 0;
759
- height: 100%;
760
- }
761
- .ui-slider-horizontal .ui-slider-range-min {
762
- left: 0;
763
- }
764
- .ui-slider-horizontal .ui-slider-range-max {
765
- right: 0;
766
- }
767
-
768
- .ui-slider-vertical {
769
- width: .8em;
770
- height: 100px;
771
- }
772
- .ui-slider-vertical .ui-slider-handle {
773
- left: -.3em;
774
- margin-left: 0;
775
- margin-bottom: -.6em;
776
- }
777
- .ui-slider-vertical .ui-slider-range {
778
- left: 0;
779
- width: 100%;
780
- }
781
- .ui-slider-vertical .ui-slider-range-min {
782
- bottom: 0;
783
- }
784
- .ui-slider-vertical .ui-slider-range-max {
785
- top: 0;
786
- }
787
- .ui-sortable-handle {
788
- -ms-touch-action: none;
789
- touch-action: none;
790
- }
791
- .ui-spinner {
792
- position: relative;
793
- display: inline-block;
794
- overflow: hidden;
795
- padding: 0;
796
- vertical-align: middle;
797
- }
798
- .ui-spinner-input {
799
- border: none;
800
- background: none;
801
- color: inherit;
802
- padding: .222em 0;
803
- margin: .2em 0;
804
- vertical-align: middle;
805
- margin-left: .4em;
806
- margin-right: 2em;
807
- }
808
- .ui-spinner-button {
809
- width: 1.6em;
810
- height: 50%;
811
- font-size: .5em;
812
- padding: 0;
813
- margin: 0;
814
- text-align: center;
815
- position: absolute;
816
- cursor: default;
817
- display: block;
818
- overflow: hidden;
819
- right: 0;
820
- }
821
- /* more specificity required here to override default borders */
822
- .ui-spinner a.ui-spinner-button {
823
- border-top-style: none;
824
- border-bottom-style: none;
825
- border-right-style: none;
826
- }
827
- .ui-spinner-up {
828
- top: 0;
829
- }
830
- .ui-spinner-down {
831
- bottom: 0;
832
- }
833
- .ui-tabs {
834
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
835
- padding: .2em;
836
- }
837
- .ui-tabs .ui-tabs-nav {
838
- margin: 0;
839
- padding: .2em .2em 0;
840
- }
841
- .ui-tabs .ui-tabs-nav li {
842
- list-style: none;
843
- float: left;
844
- position: relative;
845
- top: 0;
846
- margin: 1px .2em 0 0;
847
- border-bottom-width: 0;
848
- padding: 0;
849
- white-space: nowrap;
850
- }
851
- .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
852
- float: left;
853
- padding: .5em 1em;
854
- text-decoration: none;
855
- }
856
- .ui-tabs .ui-tabs-nav li.ui-tabs-active {
857
- margin-bottom: -1px;
858
- padding-bottom: 1px;
859
- }
860
- .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
861
- .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
862
- .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
863
- cursor: text;
864
- }
865
- .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
866
- cursor: pointer;
867
- }
868
- .ui-tabs .ui-tabs-panel {
869
- display: block;
870
- border-width: 0;
871
- padding: 1em 1.4em;
872
- background: none;
873
- }
874
- .ui-tooltip {
875
- padding: 8px;
876
- position: absolute;
877
- z-index: 9999;
878
- max-width: 300px;
879
- }
880
- body .ui-tooltip {
881
- border-width: 2px;
882
- }
883
-
884
- /* Component containers
885
- ----------------------------------*/
886
- .ui-widget {
887
- font-family: Arial,Helvetica,sans-serif;
888
- font-size: 1em;
889
- }
890
- .ui-widget .ui-widget {
891
- font-size: 1em;
892
- }
893
- .ui-widget input,
894
- .ui-widget select,
895
- .ui-widget textarea,
896
- .ui-widget button {
897
- font-family: Arial,Helvetica,sans-serif;
898
- font-size: 1em;
899
- }
900
- .ui-widget.ui-widget-content {
901
- border: 1px solid #c5c5c5;
902
- }
903
- .ui-widget-content {
904
- border: 1px solid #dddddd;
905
- background: #ffffff;
906
- color: #333333;
907
- }
908
- .ui-widget-content a {
909
- color: #333333;
910
- }
911
- .ui-widget-header {
912
- border: 1px solid #dddddd;
913
- background: #e9e9e9;
914
- color: #333333;
915
- font-weight: bold;
916
- }
917
- .ui-widget-header a {
918
- color: #333333;
919
- }
920
-
921
- /* Interaction states
922
- ----------------------------------*/
923
- .ui-state-default,
924
- .ui-widget-content .ui-state-default,
925
- .ui-widget-header .ui-state-default,
926
- .ui-button,
927
-
928
- /* We use html here because we need a greater specificity to make sure disabled
929
- works properly when clicked or hovered */
930
- html .ui-button.ui-state-disabled:hover,
931
- html .ui-button.ui-state-disabled:active {
932
- border: 1px solid #c5c5c5;
933
- background: #f6f6f6;
934
- font-weight: normal;
935
- color: #454545;
936
- }
937
- .ui-state-default a,
938
- .ui-state-default a:link,
939
- .ui-state-default a:visited,
940
- a.ui-button,
941
- a:link.ui-button,
942
- a:visited.ui-button,
943
- .ui-button {
944
- color: #454545;
945
- text-decoration: none;
946
- }
947
- .ui-state-hover,
948
- .ui-widget-content .ui-state-hover,
949
- .ui-widget-header .ui-state-hover,
950
- .ui-state-focus,
951
- .ui-widget-content .ui-state-focus,
952
- .ui-widget-header .ui-state-focus,
953
- .ui-button:hover,
954
- .ui-button:focus {
955
- border: 1px solid #cccccc;
956
- background: #ededed;
957
- font-weight: normal;
958
- color: #2b2b2b;
959
- }
960
- .ui-state-hover a,
961
- .ui-state-hover a:hover,
962
- .ui-state-hover a:link,
963
- .ui-state-hover a:visited,
964
- .ui-state-focus a,
965
- .ui-state-focus a:hover,
966
- .ui-state-focus a:link,
967
- .ui-state-focus a:visited,
968
- a.ui-button:hover,
969
- a.ui-button:focus {
970
- color: #2b2b2b;
971
- text-decoration: none;
972
- }
973
-
974
- .ui-visual-focus {
975
- box-shadow: 0 0 3px 1px rgb(94, 158, 214);
976
- }
977
- .ui-state-active,
978
- .ui-widget-content .ui-state-active,
979
- .ui-widget-header .ui-state-active,
980
- a.ui-button:active,
981
- .ui-button:active,
982
- .ui-button.ui-state-active:hover {
983
- border: 1px solid #003eff;
984
- background: #007fff;
985
- font-weight: normal;
986
- color: #ffffff;
987
- }
988
- .ui-icon-background,
989
- .ui-state-active .ui-icon-background {
990
- border: #003eff;
991
- background-color: #ffffff;
992
- }
993
- .ui-state-active a,
994
- .ui-state-active a:link,
995
- .ui-state-active a:visited {
996
- color: #ffffff;
997
- text-decoration: none;
998
- }
999
-
1000
- /* Interaction Cues
1001
- ----------------------------------*/
1002
- .ui-state-highlight,
1003
- .ui-widget-content .ui-state-highlight,
1004
- .ui-widget-header .ui-state-highlight {
1005
- border: 1px solid #dad55e;
1006
- background: #fffa90;
1007
- color: #777620;
1008
- }
1009
- .ui-state-checked {
1010
- border: 1px solid #dad55e;
1011
- background: #fffa90;
1012
- }
1013
- .ui-state-highlight a,
1014
- .ui-widget-content .ui-state-highlight a,
1015
- .ui-widget-header .ui-state-highlight a {
1016
- color: #777620;
1017
- }
1018
- .ui-state-error,
1019
- .ui-widget-content .ui-state-error,
1020
- .ui-widget-header .ui-state-error {
1021
- border: 1px solid #f1a899;
1022
- background: #fddfdf;
1023
- color: #5f3f3f;
1024
- }
1025
- .ui-state-error a,
1026
- .ui-widget-content .ui-state-error a,
1027
- .ui-widget-header .ui-state-error a {
1028
- color: #5f3f3f;
1029
- }
1030
- .ui-state-error-text,
1031
- .ui-widget-content .ui-state-error-text,
1032
- .ui-widget-header .ui-state-error-text {
1033
- color: #5f3f3f;
1034
- }
1035
- .ui-priority-primary,
1036
- .ui-widget-content .ui-priority-primary,
1037
- .ui-widget-header .ui-priority-primary {
1038
- font-weight: bold;
1039
- }
1040
- .ui-priority-secondary,
1041
- .ui-widget-content .ui-priority-secondary,
1042
- .ui-widget-header .ui-priority-secondary {
1043
- opacity: .7;
1044
- filter:Alpha(Opacity=70); /* support: IE8 */
1045
- font-weight: normal;
1046
- }
1047
- .ui-state-disabled,
1048
- .ui-widget-content .ui-state-disabled,
1049
- .ui-widget-header .ui-state-disabled {
1050
- opacity: .35;
1051
- filter:Alpha(Opacity=35); /* support: IE8 */
1052
- background-image: none;
1053
- }
1054
- .ui-state-disabled .ui-icon {
1055
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
1056
- }
1057
-
1058
- /* Icons
1059
- ----------------------------------*/
1060
-
1061
- /* states and images */
1062
- .ui-icon {
1063
- width: 16px;
1064
- height: 16px;
1065
- }
1066
- .ui-icon,
1067
- .ui-widget-content .ui-icon {
1068
- /*background-image: url("images/ui-icons_444444_256x240.png");*/
1069
- }
1070
- .ui-widget-header .ui-icon {
1071
- /*background-image: url("images/ui-icons_444444_256x240.png");*/
1072
- }
1073
- .ui-state-hover .ui-icon,
1074
- .ui-state-focus .ui-icon,
1075
- .ui-button:hover .ui-icon,
1076
- .ui-button:focus .ui-icon {
1077
- /*background-image: url("images/ui-icons_555555_256x240.png");*/
1078
- }
1079
- .ui-state-active .ui-icon,
1080
- .ui-button:active .ui-icon {
1081
- /*background-image: url("images/ui-icons_ffffff_256x240.png");*/
1082
- }
1083
- .ui-state-highlight .ui-icon,
1084
- .ui-button .ui-state-highlight.ui-icon {
1085
- /*background-image: url("images/ui-icons_777620_256x240.png");*/
1086
- }
1087
- .ui-state-error .ui-icon,
1088
- .ui-state-error-text .ui-icon {
1089
- /*background-image: url("images/ui-icons_cc0000_256x240.png");*/
1090
- }
1091
- .ui-button .ui-icon {
1092
- /*background-image: url("images/ui-icons_777777_256x240.png");*/
1093
- }
1094
-
1095
- /* positioning */
1096
- .ui-icon-blank { background-position: 16px 16px; }
1097
- .ui-icon-caret-1-n { background-position: 0 0; }
1098
- .ui-icon-caret-1-ne { background-position: -16px 0; }
1099
- .ui-icon-caret-1-e { background-position: -32px 0; }
1100
- .ui-icon-caret-1-se { background-position: -48px 0; }
1101
- .ui-icon-caret-1-s { background-position: -65px 0; }
1102
- .ui-icon-caret-1-sw { background-position: -80px 0; }
1103
- .ui-icon-caret-1-w { background-position: -96px 0; }
1104
- .ui-icon-caret-1-nw { background-position: -112px 0; }
1105
- .ui-icon-caret-2-n-s { background-position: -128px 0; }
1106
- .ui-icon-caret-2-e-w { background-position: -144px 0; }
1107
- .ui-icon-triangle-1-n { background-position: 0 -16px; }
1108
- .ui-icon-triangle-1-ne { background-position: -16px -16px; }
1109
- .ui-icon-triangle-1-e { background-position: -32px -16px; }
1110
- .ui-icon-triangle-1-se { background-position: -48px -16px; }
1111
- .ui-icon-triangle-1-s { background-position: -65px -16px; }
1112
- .ui-icon-triangle-1-sw { background-position: -80px -16px; }
1113
- .ui-icon-triangle-1-w { background-position: -96px -16px; }
1114
- .ui-icon-triangle-1-nw { background-position: -112px -16px; }
1115
- .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
1116
- .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
1117
- .ui-icon-arrow-1-n { background-position: 0 -32px; }
1118
- .ui-icon-arrow-1-ne { background-position: -16px -32px; }
1119
- .ui-icon-arrow-1-e { background-position: -32px -32px; }
1120
- .ui-icon-arrow-1-se { background-position: -48px -32px; }
1121
- .ui-icon-arrow-1-s { background-position: -65px -32px; }
1122
- .ui-icon-arrow-1-sw { background-position: -80px -32px; }
1123
- .ui-icon-arrow-1-w { background-position: -96px -32px; }
1124
- .ui-icon-arrow-1-nw { background-position: -112px -32px; }
1125
- .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
1126
- .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
1127
- .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
1128
- .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
1129
- .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
1130
- .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
1131
- .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
1132
- .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
1133
- .ui-icon-arrowthick-1-n { background-position: 1px -48px; }
1134
- .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
1135
- .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
1136
- .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
1137
- .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
1138
- .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
1139
- .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
1140
- .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1141
- .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1142
- .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1143
- .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1144
- .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1145
- .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1146
- .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1147
- .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1148
- .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1149
- .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1150
- .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1151
- .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1152
- .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1153
- .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1154
- .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1155
- .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1156
- .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1157
- .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1158
- .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1159
- .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1160
- .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1161
- .ui-icon-arrow-4 { background-position: 0 -80px; }
1162
- .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1163
- .ui-icon-extlink { background-position: -32px -80px; }
1164
- .ui-icon-newwin { background-position: -48px -80px; }
1165
- .ui-icon-refresh { background-position: -64px -80px; }
1166
- .ui-icon-shuffle { background-position: -80px -80px; }
1167
- .ui-icon-transfer-e-w { background-position: -96px -80px; }
1168
- .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1169
- .ui-icon-folder-collapsed { background-position: 0 -96px; }
1170
- .ui-icon-folder-open { background-position: -16px -96px; }
1171
- .ui-icon-document { background-position: -32px -96px; }
1172
- .ui-icon-document-b { background-position: -48px -96px; }
1173
- .ui-icon-note { background-position: -64px -96px; }
1174
- .ui-icon-mail-closed { background-position: -80px -96px; }
1175
- .ui-icon-mail-open { background-position: -96px -96px; }
1176
- .ui-icon-suitcase { background-position: -112px -96px; }
1177
- .ui-icon-comment { background-position: -128px -96px; }
1178
- .ui-icon-person { background-position: -144px -96px; }
1179
- .ui-icon-print { background-position: -160px -96px; }
1180
- .ui-icon-trash { background-position: -176px -96px; }
1181
- .ui-icon-locked { background-position: -192px -96px; }
1182
- .ui-icon-unlocked { background-position: -208px -96px; }
1183
- .ui-icon-bookmark { background-position: -224px -96px; }
1184
- .ui-icon-tag { background-position: -240px -96px; }
1185
- .ui-icon-home { background-position: 0 -112px; }
1186
- .ui-icon-flag { background-position: -16px -112px; }
1187
- .ui-icon-calendar { background-position: -32px -112px; }
1188
- .ui-icon-cart { background-position: -48px -112px; }
1189
- .ui-icon-pencil { background-position: -64px -112px; }
1190
- .ui-icon-clock { background-position: -80px -112px; }
1191
- .ui-icon-disk { background-position: -96px -112px; }
1192
- .ui-icon-calculator { background-position: -112px -112px; }
1193
- .ui-icon-zoomin { background-position: -128px -112px; }
1194
- .ui-icon-zoomout { background-position: -144px -112px; }
1195
- .ui-icon-search { background-position: -160px -112px; }
1196
- .ui-icon-wrench { background-position: -176px -112px; }
1197
- .ui-icon-gear { background-position: -192px -112px; }
1198
- .ui-icon-heart { background-position: -208px -112px; }
1199
- .ui-icon-star { background-position: -224px -112px; }
1200
- .ui-icon-link { background-position: -240px -112px; }
1201
- .ui-icon-cancel { background-position: 0 -128px; }
1202
- .ui-icon-plus { background-position: -16px -128px; }
1203
- .ui-icon-plusthick { background-position: -32px -128px; }
1204
- .ui-icon-minus { background-position: -48px -128px; }
1205
- .ui-icon-minusthick { background-position: -64px -128px; }
1206
- .ui-icon-close { background-position: -80px -128px; }
1207
- .ui-icon-closethick { background-position: -96px -128px; }
1208
- .ui-icon-key { background-position: -112px -128px; }
1209
- .ui-icon-lightbulb { background-position: -128px -128px; }
1210
- .ui-icon-scissors { background-position: -144px -128px; }
1211
- .ui-icon-clipboard { background-position: -160px -128px; }
1212
- .ui-icon-copy { background-position: -176px -128px; }
1213
- .ui-icon-contact { background-position: -192px -128px; }
1214
- .ui-icon-image { background-position: -208px -128px; }
1215
- .ui-icon-video { background-position: -224px -128px; }
1216
- .ui-icon-script { background-position: -240px -128px; }
1217
- .ui-icon-alert { background-position: 0 -144px; }
1218
- .ui-icon-info { background-position: -16px -144px; }
1219
- .ui-icon-notice { background-position: -32px -144px; }
1220
- .ui-icon-help { background-position: -48px -144px; }
1221
- .ui-icon-check { background-position: -64px -144px; }
1222
- .ui-icon-bullet { background-position: -80px -144px; }
1223
- .ui-icon-radio-on { background-position: -96px -144px; }
1224
- .ui-icon-radio-off { background-position: -112px -144px; }
1225
- .ui-icon-pin-w { background-position: -128px -144px; }
1226
- .ui-icon-pin-s { background-position: -144px -144px; }
1227
- .ui-icon-play { background-position: 0 -160px; }
1228
- .ui-icon-pause { background-position: -16px -160px; }
1229
- .ui-icon-seek-next { background-position: -32px -160px; }
1230
- .ui-icon-seek-prev { background-position: -48px -160px; }
1231
- .ui-icon-seek-end { background-position: -64px -160px; }
1232
- .ui-icon-seek-start { background-position: -80px -160px; }
1233
- /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1234
- .ui-icon-seek-first { background-position: -80px -160px; }
1235
- .ui-icon-stop { background-position: -96px -160px; }
1236
- .ui-icon-eject { background-position: -112px -160px; }
1237
- .ui-icon-volume-off { background-position: -128px -160px; }
1238
- .ui-icon-volume-on { background-position: -144px -160px; }
1239
- .ui-icon-power { background-position: 0 -176px; }
1240
- .ui-icon-signal-diag { background-position: -16px -176px; }
1241
- .ui-icon-signal { background-position: -32px -176px; }
1242
- .ui-icon-battery-0 { background-position: -48px -176px; }
1243
- .ui-icon-battery-1 { background-position: -64px -176px; }
1244
- .ui-icon-battery-2 { background-position: -80px -176px; }
1245
- .ui-icon-battery-3 { background-position: -96px -176px; }
1246
- .ui-icon-circle-plus { background-position: 0 -192px; }
1247
- .ui-icon-circle-minus { background-position: -16px -192px; }
1248
- .ui-icon-circle-close { background-position: -32px -192px; }
1249
- .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1250
- .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1251
- .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1252
- .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1253
- .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1254
- .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1255
- .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1256
- .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1257
- .ui-icon-circle-zoomin { background-position: -176px -192px; }
1258
- .ui-icon-circle-zoomout { background-position: -192px -192px; }
1259
- .ui-icon-circle-check { background-position: -208px -192px; }
1260
- .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1261
- .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1262
- .ui-icon-circlesmall-close { background-position: -32px -208px; }
1263
- .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1264
- .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1265
- .ui-icon-squaresmall-close { background-position: -80px -208px; }
1266
- .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1267
- .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1268
- .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1269
- .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1270
- .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1271
- .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1272
-
1273
-
1274
- /* Misc visuals
1275
- ----------------------------------*/
1276
-
1277
- /* Corner radius */
1278
- .ui-corner-all,
1279
- .ui-corner-top,
1280
- .ui-corner-left,
1281
- .ui-corner-tl {
1282
- border-top-left-radius: 3px;
1283
- }
1284
- .ui-corner-all,
1285
- .ui-corner-top,
1286
- .ui-corner-right,
1287
- .ui-corner-tr {
1288
- border-top-right-radius: 3px;
1289
- }
1290
- .ui-corner-all,
1291
- .ui-corner-bottom,
1292
- .ui-corner-left,
1293
- .ui-corner-bl {
1294
- border-bottom-left-radius: 3px;
1295
- }
1296
- .ui-corner-all,
1297
- .ui-corner-bottom,
1298
- .ui-corner-right,
1299
- .ui-corner-br {
1300
- border-bottom-right-radius: 3px;
1301
- }
1302
-
1303
- /* Overlays */
1304
- .ui-widget-overlay {
1305
- background: #aaaaaa;
1306
- opacity: .003;
1307
- filter: Alpha(Opacity=.3); /* support: IE8 */
1308
- }
1309
- .ui-widget-shadow {
1310
- -webkit-box-shadow: 0px 0px 5px #666666;
1311
- box-shadow: 0px 0px 5px #666666;
1312
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/trp-editor-script.js DELETED
@@ -1,1707 +0,0 @@
1
- /**
2
- * Handle Editor interface
3
- */
4
- function TRP_Editor(){
5
- trp_action_button_html = '<trp-span><trp-merge title="' + trp_localized_text['merge'] + '" class="trp-icon trp-merge dashicons dashicons-arrow-up-alt"></trp-merge><trp-split title="' + trp_localized_text['split'] + '" class="trp-icon trp-split dashicons dashicons-arrow-down-alt"></trp-split><trp-edit title="' + trp_localized_text['edit'] + '" class="trp-icon trp-edit-translation dashicons dashicons-edit"></trp-edit></trp-span>';
6
- var _this = this;
7
- this.preview_iframe = null;
8
- var strings;
9
- var dictionaries;
10
- var default_language;
11
- var TRP_TRANSLATION_ID = 'data-trp-translate-id';
12
- var TRP_BLOCK_TYPE = 'data-trp-block-type';
13
- this.original_textarea = jQuery( '#trp-original' );
14
- var loading_animation = jQuery( '#trp-string-saved-ajax-loader' );
15
- var translation_saved = jQuery( '#trp-translation-saved' );
16
- var preview_container = jQuery( '#trp-preview' );
17
- var controls = jQuery( '#trp-controls' );
18
- var save_button = jQuery( '.trp-save-string' );
19
- var close_button = jQuery( '#trp-controls-close' );
20
- var translated_textareas = [];
21
- this.edit_translation_button = null;
22
- var categories;
23
- this.trp_lister = null;
24
- this.jquery_string_selector = jQuery( '#trp-string-categories' );
25
- this.change_tracker = null;
26
- this.maybe_overflow_fix = null;
27
-
28
- /**
29
- * Change the language in the Editor from the dropdown.
30
- *
31
- * @param select HTML Element Select with languages
32
- */
33
- this.change_language = function( select ){
34
- var language = select.value;
35
- var link = jQuery( '#trp-preview-iframe' ).contents().find('link[hreflang=' + language.replace("_", "-") + ']').first().attr('href');
36
- if ( link != undefined ){
37
-
38
- /* pass on trp-view-as parameters to all links that also have preview parameter */
39
- if( typeof URL == 'function' && window.location.href.search("trp-view-as=") >= 0 && window.location.href.search("trp-view-as-nonce=") >= 0 ){
40
- var currentUrl = new URL(window.location.href);
41
- var trp_view_as = currentUrl.searchParams.get("trp-view-as");
42
- link = _this.update_query_string('trp-view-as', trp_view_as, link );
43
-
44
- var trp_view_as_nonce = currentUrl.searchParams.get("trp-view-as-nonce");
45
- link = _this.update_query_string('trp-view-as-nonce', trp_view_as_nonce, link );
46
- }
47
- link = _this.update_query_string('trp-edit-translation', 'true', link );
48
- window.location.href = link;
49
- }
50
- };
51
-
52
- /**
53
- * Change view as iframe source
54
- *
55
- * @param select HTML Element Select with languages
56
- */
57
- this.change_view_as = function( select ){
58
- var view_as = select.value;
59
- var view_nonce = jQuery('option:selected', select).attr('data-view-as-nonce');
60
- var current_link = document.getElementById("trp-preview-iframe").contentWindow.location.href;
61
- current_link = current_link.replace( 'trp-edit-translation=true', 'trp-edit-translation=preview' );
62
-
63
- /* remove maybe previously selected values */
64
- current_link = _this.remove_url_parameter( current_link, 'trp-view-as' );
65
- current_link = _this.remove_url_parameter( current_link, 'trp-view-as-nonce' );
66
-
67
- if ( current_link != undefined ){
68
- if( view_as == 'current_user' )
69
- jQuery( '#trp-preview-iframe' ).attr('src', current_link );
70
- else
71
- jQuery( '#trp-preview-iframe' ).attr('src', current_link + '&trp-view-as=' + view_as + '&trp-view-as-nonce=' + view_nonce );
72
- }
73
- };
74
-
75
- /**
76
- * Initialize string finding, string select dropdown and change tracker.
77
- */
78
- this.initialize = function(){
79
- _this.saving_translation_ui();
80
-
81
- _this.edit_translation_button = null;
82
-
83
- _this.update_parent_url();
84
-
85
- if ( _this.trp_lister != null ) {
86
- _this.jquery_string_selector.off( 'change', _this.trp_lister.select_string );
87
- }
88
- _this.iframe_strings_lookup();
89
-
90
- _this.trp_lister = new TRP_Lister( dictionaries[trp_on_screen_language] );
91
-
92
- if ( _this.change_tracker != null ) {
93
- _this.change_tracker.destroy();
94
- }
95
- };
96
-
97
- /**
98
- * Mimic the navigation in iframe to the parent window.
99
- */
100
- this.update_parent_url = function(){
101
-
102
- var location = document.getElementById("trp-preview-iframe").contentWindow.location.href;
103
- var close_url = location.replace( '&trp-edit-translation=preview', '' );
104
- close_url = close_url.replace( '?trp-edit-translation=preview', '?' );
105
-
106
- /* remove the lang atribute from url. TODO maybe use this same method for trp-edit-translation ? */
107
- close_url = _this.remove_url_parameter( close_url, 'lang' );
108
- close_url = _this.remove_url_parameter( close_url, 'trp-view-as' );
109
- close_url = _this.remove_url_parameter( close_url, 'trp-view-as-nonce' );
110
-
111
- if ( close_url[close_url.length -1] == '?' ){
112
- close_url = close_url.slice(0, -1);
113
- }
114
-
115
- close_button.attr( 'href', close_url );
116
- location = location.replace( 'trp-edit-translation=preview', 'trp-edit-translation=true' );
117
- window.history.replaceState( null, null, location );
118
- };
119
-
120
- /**
121
- * Search for strings in preview window.
122
- *
123
- * Collects all strings prepared in the back-end and triggers ajax request.
124
- */
125
- this.iframe_strings_lookup = function(){
126
- _this.preview_iframe = jQuery( '#trp-preview-iframe').contents();
127
- strings = [];
128
- dictionaries = [];
129
-
130
- var all_strings = _this.preview_iframe.find( '[data-trp-translate-id]' );
131
- if( all_strings.length != 0 ){
132
- var title = document.getElementById("trp-preview-iframe").contentDocument.title;
133
- if ( /<[a-z][\s\S]*>/i.test( title ) ) {
134
- // add iframe title
135
- all_strings.push ( jQuery( document.getElementById("trp-preview-iframe").contentDocument.title )[0] );
136
- }
137
- var strings_to_query = [];
138
- for ( var i = 0; i < all_strings.length; i++ ) {
139
- var string = new TRP_String( trp_on_screen_language, i );
140
- string.set_raw_string( all_strings[i] );
141
- strings.push( string );
142
- strings_to_query.push( string.get_details());
143
- }
144
-
145
- dictionaries[trp_on_screen_language] = new TRP_Dictionary( trp_on_screen_language );
146
- dictionaries[trp_on_screen_language].set_on_screen_strings( strings );
147
-
148
- _this.ajax_get_strings( strings_to_query );
149
- }
150
- else{
151
- _this.trp_lister = new TRP_Lister( new TRP_Dictionary( trp_language ) );
152
- _this.trp_lister.reload_list();
153
- _this.change_tracker = new TRP_Change_Tracker( _this.original_textarea, translated_textareas );
154
- _this.saved_translation_ui( true );
155
- }
156
- };
157
-
158
- /**
159
- * Query for strings to get original translation.
160
- *
161
- * @param strings_to_query Strings to find a translation for.
162
- */
163
- this.ajax_get_strings = function( strings_to_query ){
164
-
165
- jQuery.ajax({
166
- url: trp_ajax_url,
167
- type: 'post',
168
- dataType: 'json',
169
- data: {
170
- action: 'trp_get_translations',
171
- security: trp_localized_text['gettranslationsnonce'],
172
- language: trp_on_screen_language,
173
- strings: JSON.stringify( strings_to_query ),
174
- all_languages: 'true'
175
- },
176
- success: function (response) {
177
- _this.populate_strings( response );
178
- _this.trp_lister.reload_list();
179
- _this.change_tracker = new TRP_Change_Tracker( _this.original_textarea, translated_textareas );
180
- },
181
- error: function(errorThrown){
182
- console.log( 'TranslatePress AJAX Request Error' );
183
- }
184
-
185
- });
186
- };
187
-
188
- /**
189
- * Store response in dictionaries variables.
190
- *
191
- * @param response The Ajax response message.
192
- */
193
- this.populate_strings = function( response ){
194
- if ( typeof dictionaries == 'undefined' ){
195
- dictionaries = [];
196
- }
197
- for ( var key in response ) {
198
- if ( response.hasOwnProperty( key ) ) {
199
- if ( response[key]['default-language'] == true ){
200
- default_language = key;
201
- continue;
202
- }
203
- if ( dictionaries[key] == undefined ){
204
- dictionaries[key] = new TRP_Dictionary( key );
205
- }
206
-
207
- dictionaries[key].set_strings( response[key] );
208
- if ( translated_textareas[key] == undefined ) {
209
- translated_textareas[key] = jQuery( '#trp-translated-' + key );
210
- }
211
- }
212
- }
213
- _this.saved_translation_ui(true);
214
- };
215
-
216
- /**
217
- * Put the selected string into the translate textareas.
218
- *
219
- * The string can be selected from the preview window or from the select dropdown.
220
- * @param trp_string
221
- * @param index
222
- */
223
- this.edit_strings = function ( trp_string, index ){
224
- if ( _this.change_tracker == null || _this.change_tracker.check_unsaved_changes() ) {
225
- return;
226
- }
227
- _this.original_textarea.val( decode_html( trp_string.original ) );
228
- _this.original_textarea.attr( TRP_BLOCK_TYPE, trp_string.block_type );
229
- for ( var key in translated_textareas ){
230
- var translated = '';
231
- var id = '';
232
- if ( key == trp_on_screen_language ) {
233
- translated = trp_string.translated;
234
- id = trp_string.id;
235
- dictionaries[key].set_current_index( index );
236
- }else {
237
- var string = dictionaries[key].get_string_by_original( trp_string.original );
238
- if ( string ) {
239
- translated = string.translated;
240
- id = string.id;
241
- }
242
- }
243
- translated_textareas[key].val( translated );
244
- translated_textareas[key].attr( TRP_TRANSLATION_ID, id );
245
- }
246
- };
247
-
248
- /**
249
- * Prepare modified translation and send it via Ajax for saving in db.
250
- *
251
- * Triggered by Save translation button.
252
- * Calls function to send ajax request.
253
- */
254
- this.save_string = function(){
255
- var strings_to_save = {};
256
- var modified = false;
257
- var original = _this.original_textarea.val();
258
- var block_type = _this.original_textarea.attr( TRP_BLOCK_TYPE );
259
- var action = 'trp_save_translations';
260
- if ( original != "" ) {
261
- for ( var key in translated_textareas ) {
262
- var translated = translated_textareas[key].val();
263
- var id = translated_textareas[key].attr( TRP_TRANSLATION_ID );
264
- var string = {};
265
- if ( id == 'trp_creating_translation_block' ){
266
- string.translated = 'trp_creating_translation_block';
267
- string.slug = false;
268
- block_type = 1;
269
- action = 'trp_create_translation_block';
270
- }else {
271
- string = dictionaries[key].get_string_by_original(original);
272
- }
273
- if (string.slug == true) {
274
- action = 'trp_save_slug_translation';
275
- }
276
- if ( string.translated != translated ) {
277
- modified = true;
278
- if (strings_to_save[key] == undefined) {
279
- strings_to_save[key] = [];
280
- }
281
- var status = 2;
282
- if (translated.trim() == '') {
283
- status = 0;
284
- }
285
- strings_to_save[key].push({id: id, original: original, translated: translated, status: status, block_type: block_type});
286
- }
287
- }
288
- }
289
-
290
- if ( modified ){
291
- _this.saving_translation_ui();
292
- _this.ajax_save_strings( strings_to_save, action );
293
- }else{
294
- _this.saved_translation_ui();
295
- }
296
- };
297
-
298
- /**
299
- * Getter function for dictionaries.
300
- *
301
- * @returns {*} Array of dictionaries object.
302
- */
303
- this.get_dictionaries = function(){
304
- return dictionaries;
305
- };
306
-
307
-
308
- /**
309
- * Ajax request with translation to be stored.
310
- *
311
- * @param strings_to_save Strings to save in database.
312
- * @param action 'trp_save_translations' | 'trp_save_slug_translation' | 'trp_get_translations'
313
- */
314
- this.ajax_save_strings = function ( strings_to_save, action ){
315
- jQuery.ajax({
316
- url: trp_ajax_url,
317
- type: 'post',
318
- dataType: 'json',
319
- data: {
320
- action: action,
321
- security: trp_localized_text['savestringsnonce'],
322
- language: trp_on_screen_language,
323
- strings: JSON.stringify( strings_to_save ),
324
- all_languages: 'true'
325
- },
326
- success: function (response) {
327
- if ( action == 'trp_create_translation_block' ){
328
- _this.populate_translation_block_strings( response );
329
- }else {
330
- _this.populate_strings(strings_to_save);
331
- }
332
- _this.saved_translation_ui();
333
- },
334
- error: function(errorThrown){
335
- loading_animation.toggle();
336
- console.log( 'TranslatePress AJAX Request Error' );
337
- }
338
- });
339
- };
340
-
341
- /**
342
- * Call populate strings on response
343
- *
344
- * Remove individual strings composing the translation blocks
345
- * Reload list
346
- * Removes the highlight of the translation block
347
- *
348
- * @param response
349
- */
350
- this.populate_translation_block_strings = function( response ){
351
- // remove individual strings composing the translation blocks
352
- trpEditor.preview_iframe.contents().find('.trp-create-translation-block [data-trp-translate-id]').each( function(){
353
- dictionaries[trp_on_screen_language].remove_strings_with_id_from_translation_block( jQuery( this ).attr( TRP_TRANSLATION_ID ) );
354
- });
355
- _this.populate_strings( response );
356
- _this.trp_lister.reload_list();
357
-
358
- // remove highlighting of possibly highlighted new translation block
359
- trpEditor.preview_iframe.contents().find('.trp-create-translation-block').removeClass('trp-highlight trp-create-translation-block');
360
- };
361
-
362
- /*
363
- * Construct a string version for the top_parents_array
364
- */
365
- this.get_parent_block = function ( jquery_object ){
366
- if ( typeof trp_merge_rules.top_parents_selector == 'undefined' ) {
367
- var t = 0;
368
- var top_parents_string = trp_merge_rules.top_parents[t];
369
- while (t + 1 < trp_merge_rules.top_parents.length) {
370
- t = t + 1;
371
- top_parents_string = top_parents_string + ', ' + trp_merge_rules.top_parents[t];
372
- }
373
- trp_merge_rules.top_parents_selector = top_parents_string;
374
- }
375
-
376
- return jquery_object.closest( trp_merge_rules.top_parents_selector );
377
- };
378
-
379
- /**
380
- * Return 'merge', 'split' or 'none' for the jquery_object received based on rules.
381
- */
382
- this.decide_if_merge_or_split = function ( trp_string_to_merge ){
383
-
384
- if ( typeof trp_merge_rules == 'undefined' ) {
385
- return 'none';
386
- }
387
-
388
- // if string is an active translation block
389
- if ( trp_string_to_merge.block_type == 1 ){
390
- return 'split';
391
- }
392
-
393
- var jquery_object = trp_string_to_merge.jquery_object;
394
- // check if object is of correct type
395
- for ( var s in trp_merge_rules.self_object_type ) {
396
- if ( jquery_object.is( trp_merge_rules.self_object_type[s] ) ) {
397
- if ( typeof trp_merge_rules.top_parents != 'undefined' && trp_merge_rules.top_parents.length > 0 ) {
398
- // closest element which is of type like
399
- var block_parent = _this.get_parent_block(jquery_object);
400
- if ( block_parent.length > 0 ){
401
- for ( var sl in trp_merge_rules.self_object_type ) {
402
- mergeable_children_count = block_parent.find( trp_merge_rules.self_object_type[sl] ).length;
403
- if ( mergeable_children_count > 1 ) {
404
- for( var i in trp_merge_rules.incompatible_siblings ){
405
- var incompatible_children = block_parent.find( trp_merge_rules.incompatible_siblings[i] ).length;
406
- if ( incompatible_children > 0 ) {
407
- return 'none';
408
- }
409
- }
410
- return 'merge';
411
- }
412
- }
413
- }
414
- }
415
- }
416
- }
417
- return 'none';
418
- };
419
-
420
- /*
421
- * Strips all the html added by TP Editor to return a vanilla html.
422
- *
423
- * Returns original language even if in TP Editor is in secondary language preview.
424
- */
425
- this.strip_editor_meta_data = function ( parent ) {
426
- var clone = parent.clone();
427
- if ( trp_language == trp_on_screen_language ){
428
- // editor is not in original language
429
- clone.find('['+TRP_TRANSLATION_ID+']').each( function(){
430
- var trp_string = dictionaries[trp_on_screen_language].get_string_by_id( jQuery( this ).attr( TRP_TRANSLATION_ID ) );
431
- if ( trp_string.status != 0 ) {
432
- jQuery( this ).html( jQuery( this ).text().replace( trp_string.translated, trp_string.original ) );
433
- }
434
- });
435
- }
436
-
437
- clone.find('trp-span').remove();
438
- clone.find('translate-press, trp-wrap, trp-highlight').contents().unwrap();
439
-
440
- var replace_attributes = ['href', 'target'];
441
- var arrayLength = replace_attributes.length;
442
- for (var i = 0; i < arrayLength; i++) {
443
- var attribute = replace_attributes[i];
444
- clone.find('[data-trp-original-' + attribute + ']').each(function () {
445
- jQuery(this).attr( attribute, jQuery(this).attr('data-trp-original-' + attribute));
446
- jQuery(this).removeAttr('data-trp-original-' + attribute );
447
- });
448
- }
449
-
450
- var remove_attributes = ['data-trp-translate-id', 'data-trp-node-type', 'data-trp-placeholder', 'data-trp-node-description', 'data-trp-unpreviewable' ];
451
- arrayLength = remove_attributes.length;
452
- for (var i = 0; i < arrayLength; i++) {
453
- var attribute = remove_attributes[i];
454
- clone.find('[' + attribute + ']').removeAttr( attribute );
455
- }
456
-
457
- stripped_html = clone.html();
458
- return stripped_html.replace('&nbsp;', "\u00a0");
459
- };
460
-
461
- /*
462
- * Brings translation block in sidebar for saving
463
- *
464
- * @param trp_string_to_merge TRP_String from which to extract parent block.
465
- */
466
- this.prepare_merging = function( trp_string_to_merge ){
467
- // check again
468
- if ( _this.decide_if_merge_or_split( trp_string_to_merge ) != 'merge' ) {
469
- return;
470
- }
471
-
472
- var parent = _this.get_parent_block( trp_string_to_merge.jquery_object );
473
- var maybe_deprecated_id = parent.attr( 'data-trp-translate-id-deprecated' );
474
- var trp_deprecated_string = null;
475
- if ( maybe_deprecated_id != '' ){
476
- trp_deprecated_string = dictionaries[trp_on_screen_language].get_string_by_id( maybe_deprecated_id );
477
- }
478
- trpEditor.preview_iframe.find( "[" + TRP_TRANSLATION_ID + "='trp_creating_translation_block']" ).removeAttr( TRP_TRANSLATION_ID );
479
- parent.attr( TRP_TRANSLATION_ID, 'trp_creating_translation_block' );
480
- parent.find('.trp-highlight').removeClass( 'trp-highlight' );
481
- parent.addClass( 'trp-highlight trp-create-translation-block' );
482
-
483
- _this.original_textarea.val( _this.strip_editor_meta_data( parent ) );
484
- for ( var key in translated_textareas ){
485
- if ( trp_deprecated_string == null ) {
486
- translated_textareas[key].val('');
487
- }else{
488
- var trp_string = dictionaries[key].get_string_by_original( trp_deprecated_string.original );
489
- translated_textareas[key].val( trp_string.translated );
490
- }
491
- translated_textareas[key].attr( TRP_TRANSLATION_ID, 'trp_creating_translation_block' );
492
- }
493
- };
494
-
495
- /**
496
- * Submit a form with the action of splitting received translation block
497
- *
498
- * @param trp_string_to_split
499
- */
500
- this.split_translation_block = function( trp_string_to_split ){
501
- // check again
502
- if ( _this.decide_if_merge_or_split( trp_string_to_split ) != 'split' ) {
503
- return;
504
- }
505
- var split = confirm( trp_localized_text['areyousuresplittb'] );
506
- if ( split == false ){
507
- return;
508
- }
509
- var tb_to_split = [ trp_string_to_split.original ];
510
-
511
- var form = document.createElement('form');
512
- form.setAttribute('method', 'POST');
513
- form.setAttribute('action', window.location.href );
514
-
515
- var action = document.createElement('input');
516
- action.setAttribute('type', 'hidden');
517
- action.setAttribute('name', 'action');
518
- action.setAttribute('value', 'trp_split_translation_block');
519
- form.appendChild(action);
520
-
521
- var security = document.createElement('input');
522
- security.setAttribute('type', 'hidden');
523
- security.setAttribute('name', 'security');
524
- security.setAttribute('value', trp_localized_text['splittbnonce']);
525
- form.appendChild(security);
526
-
527
- var strings = document.createElement('input');
528
- strings.setAttribute('type', 'hidden');
529
- strings.setAttribute('name', 'strings');
530
- strings.setAttribute('value', JSON.stringify( tb_to_split ));
531
- form.appendChild(strings);
532
-
533
- document.body.appendChild(form);
534
- form.submit();
535
- };
536
-
537
- /**
538
- * Show UI for translation being saved.
539
- */
540
- this.saving_translation_ui = function(){
541
- loading_animation.toggle();
542
- save_button.attr( 'disabled', 'disabled' );
543
- };
544
-
545
- /**
546
- * Show UI for translation done saving.
547
- */
548
- this.saved_translation_ui = function( dontShowMessage ){
549
- dontShowMessage = dontShowMessage || 0;
550
- save_button.removeAttr( 'disabled' );
551
- if( gettext_dictionaries != null )
552
- loading_animation.css('display', 'none');//don't hide the animation if the gettexts arent loaded
553
- if ( _this.change_tracker ) {
554
- _this.change_tracker.mark_changes_saved();
555
- if( !dontShowMessage ) {
556
- translation_saved.css("display", "inline");
557
- translation_saved.delay(3000).fadeOut(400);
558
- }
559
- }
560
- };
561
-
562
- /**
563
- * Toggle extra textareas for other languages
564
- */
565
- this.toggle_languages = function (){
566
- jQuery( '.trp-other-language' ).toggle();
567
- jQuery( '.trp-toggle-languages' ).toggle();
568
- };
569
-
570
- /**
571
- * Return the given url without the given parameter and its value
572
- *
573
- * @param url
574
- * @param parameter
575
- * @returns {*}
576
- */
577
- this.remove_url_parameter = function(url, parameter) {
578
- //prefer to use l.search if you have a location/link object
579
- var urlparts= url.split('?');
580
- if (urlparts.length>=2) {
581
-
582
- var prefix= encodeURIComponent(parameter)+'=';
583
- var pars= urlparts[1].split(/[&;]/g);
584
-
585
- //reverse iteration as may be destructive
586
- for (var i= pars.length; i-- > 0;) {
587
- //idiom for string.startsWith
588
- if (pars[i].lastIndexOf(prefix, 0) !== -1) {
589
- pars.splice(i, 1);
590
- }
591
- }
592
-
593
- url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
594
- return url;
595
- } else {
596
- return url;
597
- }
598
- };
599
-
600
- /**
601
- * Update url with query string.
602
- *
603
- */
604
- this.update_query_string = function(key, value, url) {
605
- if (!url) url = window.location.href;
606
- var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
607
- hash;
608
-
609
- if (re.test(url)) {
610
- if (typeof value !== 'undefined' && value !== null)
611
- return url.replace(re, '$1' + key + "=" + value + '$2$3');
612
- else {
613
- hash = url.split('#');
614
- url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
615
- if (typeof hash[1] !== 'undefined' && hash[1] !== null)
616
- url += '#' + hash[1];
617
- return url;
618
- }
619
- }
620
- else {
621
- if (typeof value !== 'undefined' && value !== null ) {
622
- var separator = url.indexOf('?') !== -1 ? '&' : '?';
623
- hash = url.split('#');
624
- url = hash[0] + separator + key + '=' + value;
625
- if (typeof hash[1] !== 'undefined' && hash[1] !== null)
626
- url += '#' + hash[1];
627
- return url;
628
- }
629
- else
630
- return url;
631
- }
632
- };
633
-
634
- /**
635
- * Resizing preview window.
636
- *
637
- * @param event
638
- * @param ui
639
- */
640
- function resize_iframe (event, ui) {
641
- var total_width = jQuery(window).width();
642
- var width = controls.width();
643
-
644
- if(width > total_width) {
645
- width = total_width;
646
- controls.css('width', width);
647
- }
648
-
649
- preview_container.css('right', width );
650
- preview_container.css('left', ( width - 348 ) );
651
- preview_container.css('width', (total_width - width));
652
- }
653
-
654
- /**
655
- * Add event handlers for buttons and dropdowns.
656
- */
657
- function add_event_handlers(){
658
- save_button.on( 'click', function(e){
659
- e.preventDefault();
660
- /* trigger a save for a normal string here and not a gettext string */
661
- if(jQuery(this).attr('id') == 'trp-save'){
662
- _this.save_string();
663
- }
664
- });
665
- jQuery( '.trp-toggle-languages span' ).on( 'click', _this.toggle_languages );
666
- jQuery( '#trp-previous' ).on( 'click', function(e){
667
- e.preventDefault();
668
- if ( _this.change_tracker == null || _this.change_tracker.check_unsaved_changes() ) {
669
- return;
670
- }
671
- prev_option_value = jQuery( 'option:selected', _this.jquery_string_selector ).prevAll('option').first().attr('value');
672
- if( typeof prev_option_value != "undefined" && prev_option_value != '' ) {
673
- _this.jquery_string_selector.val(prev_option_value).trigger('change');
674
- }
675
- });
676
- jQuery( '#trp-next' ).on( 'click', function(e){
677
- e.preventDefault();
678
- if ( _this.change_tracker == null || _this.change_tracker.check_unsaved_changes() ) {
679
- return;
680
- }
681
- next_option_value = jQuery('option:selected', _this.jquery_string_selector).nextAll('option').first().attr('value');
682
- if( typeof next_option_value != "undefined" && next_option_value != '' ) {
683
- _this.jquery_string_selector.val(next_option_value).trigger('change');
684
- }
685
- });
686
-
687
- controls.resizable({
688
- start: function( ) { preview_container.toggle(); },
689
- stop: function( ) { preview_container.toggle(); },
690
- handles: 'e',
691
- minWidth: 190,
692
- alsoResize: '.trp-language-text textarea, span.select2-container, #trp-string-categories',
693
-
694
- }).bind( "resize", resize_iframe );
695
-
696
- jQuery( window ).resize(function () {
697
- resize_iframe();
698
- });
699
-
700
- var placeholder_text = _this.jquery_string_selector.attr('data-trp-placeholder');
701
- if (placeholder_text != '') {
702
- placeholder_text = 'Select string to translate...';
703
- }
704
- _this.jquery_string_selector.select2({ placeholder: placeholder_text, templateResult: format_option, width: '100%' });
705
- jQuery( '#trp-language-select' ).select2({ width: '100%' });
706
- jQuery( '#trp-view-as-select' ).select2({ width: '100%' });
707
-
708
- /* when we have unsaved changes prevent the strings dropdown from opening so we do not have a disconnect between the textareas and the dropdown */
709
- _this.jquery_string_selector.on('select2:opening', function (e) {
710
- if ( trpEditor.change_tracker == null || trpEditor.change_tracker.check_unsaved_changes() ) {
711
- e.preventDefault();
712
- }
713
- });
714
- jQuery( "#trp-preview-iframe" ).on( 'trp_page_loaded', _this.initialize );
715
- }
716
-
717
- /**
718
- * Remove pencil icon from preview window.
719
- */
720
- this.remove_pencil_icon = function(){
721
- jQuery( '#trp-preview-iframe').contents().find( 'trp-span' ).remove();
722
- };
723
-
724
- /**
725
- * if the edit icon button has a parent with overflow hidden and position relative it won't show so we want to change it's margin to 0 so it will appear inside the element
726
- */
727
- this.maybe_overflow_fix = function( icon ){
728
- /*if (navigator.userAgent.search("Chrome") >= 0 || navigator.userAgent.search("Firefox") >= 0 || navigator.userAgent.search("Edge") >= 0 ) {
729
- icon.parents().filter( function(){ var overflow = jQuery(this).css('overflow');
730
- return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
731
- jQuery(this).parent().addClass('trp-overflow-transform-fixer');
732
- return false;
733
- });
734
- }
735
- else{*/
736
- icon.parents().filter( function(index){ if( index > 6 ) return false;var overflow = jQuery(this).css('overflow');
737
- return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
738
- jQuery(this).addClass('trp-overflow-inside-fixer');
739
- return false;
740
- });
741
- //}
742
- };
743
-
744
- /**
745
- * Make string selection dropdown to have options with descriptions below.
746
- *
747
- * @param option
748
- * @returns {*}
749
- */
750
- function format_option(option){
751
- option = jQuery(
752
- '<div>' + option.text + '</div><div class="string-selector-description">' + option.title + '</div>'
753
- );
754
- return option;
755
- }
756
-
757
- this.make_sure_pencil_icon_is_inside_view = function( jquery_object_highlighted ){
758
- var rect = jquery_object_highlighted.getBoundingClientRect();
759
- if (rect.left < 30 ){
760
- var margin = - rect.left;
761
- trpEditor.edit_translation_button[0].setAttribute( 'style', 'margin-left: ' + margin + 'px !important' );
762
- }else{
763
- trpEditor.edit_translation_button[0].removeAttribute( 'style' );
764
- }
765
- };
766
-
767
- add_event_handlers();
768
- }
769
-
770
- /**
771
- * Collection of TRP_String for a particular language.
772
- */
773
- function TRP_Dictionary( language_code ){
774
-
775
- var _this = this;
776
- this.strings = []; // TRP_String
777
- this.language = language_code;
778
- var current_index = 0;
779
-
780
-
781
- /**
782
- * The currently translated index of the Dictionary.
783
- *
784
- * Refers to a TRP_String object of this dictionary at the specified index.
785
- *
786
- * @param index
787
- */
788
- this.set_current_index = function ( index ){
789
- current_index = index;
790
- };
791
-
792
- /**
793
- * Foreach TRP_String of this dictionary, update the values received as parameter.
794
- *
795
- * For new strings, create new entries.
796
- *
797
- * @param strings_object
798
- */
799
- this.set_strings = function( strings_object ){
800
- for ( var s in _this.strings ){
801
- for ( var i in strings_object ){
802
- if ( ( _this.strings[s].id == strings_object[i].id || ( ( _this.strings[s].original ) && _this.strings[s].original.trim() == strings_object[i].original.trim() ) )
803
- && (
804
- ( _this.strings[s].jquery_object == null ) ||
805
- ( typeof _this.strings[s].jquery_object == 'undefined' ) ||
806
- ( _this.strings[s].jquery_object != null && strings_object[i].jquery_object == null ) ||
807
- ( strings_object[i].jquery_object ==_this.strings[s].jquery_object )
808
- )
809
- && _this.strings[s].block_type != 2
810
- ) {
811
- strings_object[i].set = true;
812
- _this.strings[s].set_string( strings_object[i] );
813
- break;
814
- }
815
- }
816
- }
817
- for ( var i in strings_object ) {
818
- if ( strings_object[i].hasOwnProperty( 'set' ) && strings_object[i].set == true ){
819
- continue;
820
- }
821
- var string = new TRP_String( _this.language, _this.strings.length );
822
- string.set_string( strings_object[i] );
823
- _this.strings.push(string);
824
- }
825
-
826
- };
827
-
828
- /**
829
- * Remove trp_strings which match the id from this dictionary and has ancestor a newly created translation block
830
- *
831
- * @param id
832
- */
833
- this.remove_strings_with_id_from_translation_block = function ( id ){
834
- for ( var i in _this.strings ) {
835
- if (_this.strings[i].id == id && _this.strings[i].jquery_object.parents( '.trp-create-translation-block' ).length > 0 ){
836
- //remove from array
837
- delete( _this.strings[i] );
838
- }
839
- }
840
- };
841
-
842
- /**
843
- * Concatenate given strings with the existing list.
844
- *
845
- * @param new_strings
846
- */
847
- this.set_on_screen_strings = function( new_strings ){
848
- _this.strings = _this.strings.concat( new_strings );
849
- };
850
-
851
- /**
852
- * Return a TRP_String entry for the given id.
853
- *
854
- * @param id
855
- */
856
- this.get_string_by_id = function( id ){
857
- for ( var i in _this.strings ) {
858
- if (_this.strings[i].id == id) {
859
- return _this.strings[i];
860
- }
861
- }
862
- return null;
863
- };
864
-
865
- /**
866
- * Return a TRP_String entry for the given original.
867
- *
868
- * @param original
869
- * @returns {*}
870
- */
871
- this.get_string_by_original = function ( original ){
872
- for ( var i in _this.strings ){
873
- if ( _this.strings[i].original.trim() == original.trim() ){
874
- return _this.strings[i];
875
- }
876
- }
877
- return {};
878
- };
879
-
880
- /**
881
- * Place in translating textareas the string at given index in dictionary.
882
- *
883
- * @param index
884
- */
885
- this.edit_string_index = function( index ){
886
- if( index ) {
887
- /* start modifications of the editor screen */
888
- jQuery('.trp-save-string').attr('id', 'trp-save');
889
- jQuery('.trp-language-name[data-trp-gettext-language-name]').text(jQuery('.trp-language-name[data-trp-default-language-name]').attr('data-trp-default-language-name'));
890
- jQuery('#trp-gettext-original').hide();
891
- jQuery('.trp-discard-on-default-language').hide();
892
- jQuery('.trp-default-language textarea').attr('readonly', 'readonly');
893
- /* end modifications of the editor screen */
894
- _this.strings[index].edit_string();
895
- }
896
- };
897
-
898
- /**
899
- * Return strings organized in categories.
900
- *
901
- * Used in String selection dropdown.
902
- *
903
- * @returns {Array}
904
- */
905
- this.get_categories = function (){
906
- var categorized = [];
907
- categorized[ 'Meta Information' ] = [];
908
- categorized[ 'String List' ] = [];
909
- for ( var i in _this.strings ){
910
- if ( categorized[ _this.strings[i].node_type ] == undefined ) {
911
- categorized[ _this.strings[i].node_type ] = [];
912
- }
913
- if ( _this.strings[i].original != '' ){
914
- categorized[ _this.strings[i].node_type ].push( _this.strings[i] );
915
- }
916
- }
917
-
918
- for ( var i in categorized ){
919
- if ( categorized[i].length == 0 ){
920
- delete categorized[i];
921
- }
922
- }
923
-
924
- return categorized;
925
- };
926
-
927
- }
928
-
929
- /**
930
- * String original, translation and jquery object.
931
- */
932
- function TRP_String( language, array_index ){
933
- var _this = this;
934
- var TRP_TRANSLATION_ID = 'data-trp-translate-id';
935
- var TRP_NODE_TYPE = 'data-trp-node-type';
936
- var TRP_NODE_DESCRIPTION = 'data-trp-node-description';
937
- this.id = null;
938
- this.original = null;
939
- this.translated = null;
940
- this.status = null;
941
- this.node_type = trp_localized_text['dynamicstrings'];
942
- this.node_description = '';
943
- this.jquery_object = null;
944
- this.language = language;
945
- this.index = array_index;
946
- this.slug = false;
947
- this.slug_post_id = false;
948
-
949
- /**
950
- * Return string id, original and slug details
951
- *
952
- * Used in get translation request.
953
- *
954
- * @returns {{}}
955
- */
956
- this.get_details = function(){
957
- var details = {};
958
- if ( _this.slug ){
959
- details['slug'] = _this.slug;
960
- details['slug_post_id'] = _this.slug_post_id;
961
- }
962
- details['id'] = _this.id;
963
- details['original'] = _this.original;
964
- return details;
965
- };
966
-
967
- /**
968
- * Replace existing text from iframe with specified string
969
- *
970
- * @param text_to_set
971
- * @param jquery_object
972
- */
973
- this.set_text_in_iframe = function( text_to_set, jquery_object ){
974
- if (text_to_set) {
975
- var initial_value = jquery_object.text();
976
- text_to_set = initial_value.replace(initial_value.trim(), text_to_set);
977
- if ( jquery_object.attr( 'data-trp-attr' ) ){
978
- jquery_object.children().attr( jquery_object.attr('data-trp-attr'), text_to_set );
979
- }else if( jquery_object.attr( 'data-trp-button' ) ){
980
- jquery_object.children('button').text(text_to_set);
981
- }else {
982
- if (jquery_object.text().trim() !== text_to_set.trim() ){
983
- jquery_object.html( text_to_set );
984
- }
985
- }
986
- }
987
- };
988
-
989
- /**
990
- * Update string information. Also updates in page if available.
991
- *
992
- * @param new_settings
993
- */
994
- this.set_string = function ( new_settings ){
995
- _this.id = ( new_settings.hasOwnProperty ( 'id' ) ) ? new_settings.id : _this.id;
996
- _this.original = ( new_settings.hasOwnProperty ( 'original' ) ) ? new_settings.original : _this.original;
997
- _this.jquery_object = ( new_settings.hasOwnProperty ( 'jquery_object' ) ) ? new_settings.jquery_object : _this.jquery_object;
998
- _this.block_type = ( new_settings.hasOwnProperty ( 'block_type' ) ) ? new_settings.block_type : _this.block_type;
999
- if ( _this.block_type == 1 ){
1000
- _this.node_description = trp_localized_text['translationblock'];
1001
- }
1002
-
1003
- if ( new_settings.hasOwnProperty ( 'new_translation_block' ) && new_settings.new_translation_block == true && _this.language == trp_on_screen_language ){
1004
- _this.jquery_object = trpEditor.preview_iframe.find( "[" + TRP_TRANSLATION_ID + "='trp_creating_translation_block']" );
1005
- _this.jquery_object.attr( TRP_TRANSLATION_ID, _this.id );
1006
- _this.jquery_object = trpEditor.preview_iframe.find( "[" + TRP_TRANSLATION_ID + "='" + _this.id + "'" );
1007
-
1008
- _this.jquery_object.addClass('translation-block');
1009
- _this.node_type = trp_localized_text['stringlist'];
1010
- _this.jquery_object.attr( TRP_NODE_TYPE, _this.node_type );
1011
-
1012
- _this.node_type = trp_localized_text['stringlist'];
1013
- if ( trp_language != trp_on_screen_language ) {
1014
- _this.set_text_in_iframe( _this.original, _this.jquery_object );
1015
- }else{
1016
- _this.set_text_in_iframe( _this.translated, _this.jquery_object );
1017
- }
1018
- }
1019
-
1020
- if ( _this.jquery_object && _this.block_type != 2 ) {
1021
- _this.wrap_special_html_elements();
1022
- if ( trp_language == trp_on_screen_language ) {
1023
- var text_to_set = null;
1024
- if (new_settings.hasOwnProperty('translated') && new_settings.translated != _this.translated) {
1025
- text_to_set = decode_html ( new_settings.translated );
1026
- }
1027
- if (new_settings.hasOwnProperty('status') && new_settings.status == 0) {
1028
- text_to_set = _this.original;
1029
- }
1030
- _this.set_text_in_iframe( text_to_set, _this.jquery_object );
1031
- }
1032
-
1033
- _this.jquery_object.on( 'mouseenter', '', _this.highlight );
1034
- _this.jquery_object.on( 'mouseleave', '', _this.unhighlight );
1035
- }
1036
-
1037
- _this.status = ( new_settings.hasOwnProperty( 'status' ) ) ? new_settings.status : _this.status;
1038
- _this.translated = ( new_settings.hasOwnProperty( 'translated' ) ) ? decode_html ( new_settings.translated ) : _this.translated;
1039
- };
1040
-
1041
- /**
1042
- * Wrap buttons and placeholders so that we can display the pencil button and also replace with translation.
1043
- */
1044
- this.wrap_special_html_elements = function(){
1045
- if ( _this.jquery_object.parent().is('trp-highlight') ){
1046
- // if the iframe lookup is triggered a second time, the same string will be recognized again as the image and jquery_object is set as an image, not the trp-highlight wrapping. Fix this by assigning it to parent if exists.
1047
- _this.jquery_object = _this.jquery_object.parent();
1048
- return;
1049
- }
1050
- var extra_attribute = false;
1051
- if( _this.jquery_object.is('button') ) {
1052
- extra_attribute = 'data-trp-button="true"';
1053
- }else if ( ( _this.jquery_object.attr( 'type' ) == 'submit' || _this.jquery_object.attr( 'type' ) == 'button' ) ) {
1054
- extra_attribute = 'data-trp-attr="value"';
1055
- }else if ( ( _this.jquery_object.attr( 'type' ) == 'text' || _this.jquery_object.attr( 'type' ) == 'search' || _this.jquery_object.is( 'textarea' ) ) && ( typeof _this.jquery_object.attr( 'placeholder' ) != 'undefined' ) ) {
1056
- extra_attribute = 'data-trp-attr="placeholder"';
1057
- }else if ( _this.jquery_object.is( 'img' ) ){
1058
- extra_attribute = 'data-trp-attr="alt"';
1059
- }
1060
- if ( extra_attribute !== false ) {
1061
- _this.jquery_object.wrap('<trp-highlight ' + extra_attribute + '></trp-highlight>');
1062
- _this.jquery_object = _this.jquery_object.parent();
1063
- }
1064
- };
1065
-
1066
-
1067
- /**
1068
- * Show the pencil and border the viewable string in Preview window.
1069
- */
1070
- this.highlight = function (e){
1071
- e.stopPropagation();
1072
- var old_jquery_object = null;
1073
- var tb_parent = _this.jquery_object.parents( '.trp-create-translation-block' );
1074
- if ( tb_parent.length > 0 ){
1075
- // we are creating a new block
1076
- old_jquery_object = _this.jquery_object;
1077
- _this.jquery_object = tb_parent.first();
1078
- }
1079
-
1080
- trpEditor.remove_pencil_icon();
1081
- if ( ! trpEditor.edit_translation_button ){
1082
- _this.jquery_object.prepend( trp_action_button_html );
1083
- trpEditor.edit_translation_button = _this.jquery_object.children('trp-span');
1084
- }else{
1085
- trpEditor.maybe_overflow_fix(trpEditor.edit_translation_button);
1086
- _this.jquery_object.prepend(trpEditor.edit_translation_button);
1087
- }
1088
- trpEditor.edit_translation_button.children( ).removeClass( 'trp-active-icon' );
1089
- var merge_or_split = trpEditor.decide_if_merge_or_split( _this );
1090
- if ( old_jquery_object ){
1091
- // we are creating a new block
1092
- merge_or_split = 'merge';
1093
- }
1094
- if ( merge_or_split != 'none' ) {
1095
- trpEditor.edit_translation_button.children('trp-' + merge_or_split ).addClass( 'trp-active-icon' );
1096
- }
1097
-
1098
- trpEditor.make_sure_pencil_icon_is_inside_view( _this.jquery_object[0] );
1099
-
1100
- if ( old_jquery_object ){
1101
- // we are creating a new block
1102
- _this.jquery_object = old_jquery_object;
1103
- }
1104
- trpEditor.edit_translation_button.off( 'click' );
1105
- trpEditor.edit_translation_button.on( 'click', function(e){
1106
- e.preventDefault();
1107
- if ( trpEditor.change_tracker == null || trpEditor.change_tracker.check_unsaved_changes() ) {
1108
- return;
1109
- }
1110
-
1111
- notDoingAjax = true;
1112
- if( typeof jQuery.active != 'undefined' ){
1113
- if( jQuery.active !== 0 )
1114
- notDoingAjax = false;
1115
- }
1116
-
1117
- if( jQuery( 'option[value="'+_this.index+'"]', trpEditor.jquery_string_selector ).length != 0 && !jQuery('.trp-ajax-loader', trpEditor).is(":visible") && notDoingAjax ) {
1118
- trpEditor.jquery_string_selector.val( _this.index ).trigger( 'change', true )
1119
- }else{
1120
- trpEditor.jquery_string_selector.trigger('trpSelectorNotChanged');
1121
- }
1122
-
1123
- if( jQuery( e.target ).closest( 'trp-split' ).length > 0 ){
1124
- trpEditor.split_translation_block( _this );
1125
- }
1126
- // remove highlighting of possibly highlighted new translation block
1127
- trpEditor.preview_iframe.contents().find('.trp-highlight.trp-create-translation-block').removeClass('trp-highlight trp-create-translation-block');
1128
- if( jQuery( e.target ).closest( 'trp-merge' ).length > 0 ){
1129
- trpEditor.prepare_merging( _this );
1130
- }
1131
-
1132
-
1133
- });
1134
- if ( tb_parent.length == 0 ) {
1135
- jQuery(this).addClass('trp-highlight');
1136
- }
1137
-
1138
- };
1139
-
1140
- /**
1141
- * Remove border for viewable string
1142
- */
1143
- this.unhighlight = function (){
1144
- jQuery( this ).removeClass( 'trp-highlight' );
1145
- };
1146
-
1147
- /**
1148
- * Show string in translatable textareas.
1149
- *
1150
- * @returns {boolean}
1151
- */
1152
- this.edit_string = function(){
1153
- trpEditor.edit_strings( _this, _this.index );
1154
- return false; // cancel navigating to another link
1155
- };
1156
-
1157
- /**
1158
- * Extract fom raw html code the information for a TRP_String.
1159
- *
1160
- * @param raw_string
1161
- */
1162
- this.set_raw_string = function( raw_string ){
1163
- _this.jquery_object = jQuery( raw_string );
1164
- var translation_id_attribute = _this.jquery_object.attr( TRP_TRANSLATION_ID );
1165
- if ( translation_id_attribute ){
1166
- _this.id = translation_id_attribute;
1167
- _this.node_type = _this.jquery_object.attr( TRP_NODE_TYPE );
1168
- _this.node_description = _this.jquery_object.attr( TRP_NODE_DESCRIPTION );
1169
- if ( _this.jquery_object.attr( 'name' ) == 'trp-slug' ){
1170
- _this.slug = true;
1171
- _this.slug_post_id = _this.jquery_object.attr( 'post-id' );
1172
- _this.original = _this.jquery_object.attr( 'original' );
1173
- }
1174
- }else{
1175
- _this.original = _this.jquery_object.text();
1176
- }
1177
- };
1178
-
1179
- }
1180
-
1181
- /**
1182
- * String list dropdown handler
1183
- */
1184
- function TRP_Lister( current_dictionary ) {
1185
-
1186
- var _this = this;
1187
- var jquery_string_selector = trpEditor.jquery_string_selector;
1188
- var dictionary = current_dictionary;
1189
- var category_array;
1190
-
1191
- /*
1192
- * Save current selected option in the dropdown. Should be called before we make changes in the dropdown.
1193
- */
1194
- this.cache_selected_option = function(){
1195
- var selected_option = jQuery( 'option:selected', jquery_string_selector ).val();
1196
- if ( typeof selected_option != "undefined" && selected_option != "" ) {
1197
- cached_selected_option = selected_option;
1198
- }
1199
- };
1200
-
1201
- /*
1202
- * Restore saved cached option. Should be called after we make changes in the dropdown. Otherwise the selected option will be changed to default.
1203
- */
1204
- this.set_cached_option = function(){
1205
- if ( typeof cached_selected_option != "undefined" && cached_selected_option != "" ){
1206
- jquery_string_selector.val( cached_selected_option );
1207
- }
1208
- };
1209
-
1210
- /**
1211
- * A string has been selected from the list.
1212
- */
1213
- this.select_string = function( event, keep_pencil_icon ){
1214
- /* this is how we differentiate gettext strings from normal strings */
1215
- trp_gettext_id = jQuery(this).find(':selected').attr('data-trp-gettext-id');
1216
- if( trp_gettext_id ) {
1217
- _this.set_textareas_with_gettext(trp_gettext_id);
1218
- }
1219
- else {
1220
- dictionary.edit_string_index(jquery_string_selector.val());
1221
- }
1222
- if ( keep_pencil_icon === undefined ){
1223
- trpEditor.remove_pencil_icon();
1224
- }
1225
- };
1226
-
1227
- /**
1228
- * Refresh list with new strings.
1229
- */
1230
- this.reload_list = function (){
1231
- _this.cache_selected_option();
1232
-
1233
- category_array = dictionary.get_categories();
1234
- jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).prevAll(":not(.default-option)").remove();
1235
- /* add the normal strings before the trp-gettext-strings-optgroup optiongroup so it doesn't matter which ajax finishes first */
1236
- for ( var category in category_array ){
1237
- if ( category == 'undefined' ){
1238
- continue;
1239
- }
1240
- jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).before( jQuery( '<optgroup></optgroup>' ).attr( 'label', _this.format_category_name( category ) ) );
1241
- for ( var i in category_array[category] ) {
1242
- if ( category_array[category][i].block_type == 2 ){
1243
- continue;
1244
- }
1245
- var original = decode_html( category_array[category][i].original );
1246
- var description = '';
1247
- if ( category_array[category][i].node_description != undefined && category_array[category][i].node_description != '' ){
1248
- description = '(' + category_array[category][i].node_description + ')';
1249
- }
1250
- if ( original ) {
1251
- jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).before(jQuery('<option></option>').attr( 'value', category_array[category][i].index).text( _this.format_text( original )).attr( 'title', description ) );
1252
- }
1253
- }
1254
- }
1255
- jquery_string_selector.on( 'change', _this.select_string );
1256
-
1257
- _this.set_cached_option();
1258
- };
1259
-
1260
-
1261
- this.add_gettext_strings = function (){
1262
- _this.cache_selected_option();
1263
-
1264
- gettext_category = dictionary;
1265
- jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).nextAll().remove();
1266
- for ( var i in gettext_category){
1267
- var original = gettext_category[i].original;
1268
- jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).after(jQuery('<option></option>').attr( 'value', 'gettext-'+gettext_category[i].id ).text( _this.format_text( original )).attr( 'title', gettext_category[i].domain ).attr( 'data-trp-gettext-id', gettext_category[i].id ) );
1269
- }
1270
-
1271
- _this.set_cached_option();
1272
- };
1273
-
1274
- /**
1275
- * Escape tags for a given string
1276
- *
1277
- * @param string
1278
- */
1279
- this.escape_html = function ( string ){
1280
- var escape = document.createElement('textarea');
1281
- escape.textContent = string;
1282
- return escape.innerHTML;
1283
- };
1284
-
1285
- /**
1286
- * Cut the length of text displayed in string dropdown list.
1287
- */
1288
- this.format_text = function ( original ){
1289
- var suspension_dots = '...';
1290
- if ( original.length <= 90){
1291
- suspension_dots = '';
1292
- }
1293
-
1294
- return _this.escape_html( original.substring(0, 90) ) + suspension_dots ;
1295
- };
1296
-
1297
- /**
1298
- * Format the name for the option group in string dropdown list.
1299
- */
1300
- this.format_category_name = function( name ){
1301
- name = name.replace(/_/g, ' ');
1302
- name = name.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
1303
-
1304
- return name;
1305
- };
1306
-
1307
- this.set_textareas_with_gettext = function( string_id ){
1308
-
1309
- /* don't do anything if there is an unsaved change */
1310
- if ( trpEditor.change_tracker == null || trpEditor.change_tracker.check_unsaved_changes() ) {
1311
- return;
1312
- }
1313
-
1314
- /* start modifications of the editor screen */
1315
- jQuery( '#trp-gettext-original' ).show();
1316
- jQuery('.trp-save-string').attr('id', 'trp-save-gettext');
1317
- jQuery( '.trp-language-name[data-trp-gettext-language-name]').text(jQuery( '.trp-language-name[data-trp-gettext-language-name]').attr('data-trp-gettext-language-name'));
1318
- jQuery( '.trp-discard-on-default-language' ).show();
1319
- /* end modifications of the editor screen */
1320
-
1321
- jQuery( gettext_dictionaries[trp_language] ).each(function(){
1322
- if( this.id == string_id ){
1323
- original = this.original;
1324
- domain = this.domain;
1325
- }
1326
- });
1327
-
1328
- jQuery( '#trp-controls .trp-language-text textarea' ).each(function(){
1329
- textarea = this;
1330
-
1331
- if( jQuery(textarea).parent().hasClass('trp-default-language') ) {
1332
- jQuery(textarea).removeAttr('readonly');
1333
- }
1334
-
1335
- if( jQuery(textarea).parent().hasClass('trp-gettext-original-language') ){
1336
- jQuery( textarea ).val( original );
1337
- }
1338
- else{
1339
- textarea_language = jQuery( textarea ).attr("data-trp-language-code");
1340
- jQuery( gettext_dictionaries[textarea_language] ).each(function(){
1341
- if( this.original == original && this.domain == domain ){
1342
- jQuery( textarea ).val( this.translated );
1343
- jQuery( textarea ).attr( 'data-trp-translate-id', this.id );
1344
- }
1345
- });
1346
- }
1347
- });
1348
- };
1349
-
1350
- this.set_texts_select_to_gettext = function( jquery_object ){
1351
- if ( trpEditor.change_tracker == null || trpEditor.change_tracker.check_unsaved_changes() ) {
1352
- return;
1353
- }
1354
- string_id = jquery_object.attr('data-trpgettextoriginal');
1355
-
1356
- notDoingAjax = true;
1357
- if( typeof jQuery.active != 'undefined' ){
1358
- if( jQuery.active !== 0 )
1359
- notDoingAjax = false;
1360
- }
1361
- if( jQuery( 'option[value="gettext-'+string_id+'"]', trpEditor.jquery_string_selector ).length != 0 && !jQuery('.trp-ajax-loader', trpEditor).is(":visible") && notDoingAjax ) {
1362
- trpEditor.jquery_string_selector.val('gettext-' + string_id).trigger('change', true);
1363
- }else{
1364
- trpEditor.jquery_string_selector.trigger('trpSelectorNotChanged');
1365
- }
1366
- }
1367
-
1368
- }
1369
-
1370
- /**
1371
- * Track changes of the translation textareas.
1372
- */
1373
- function TRP_Change_Tracker( _original_textarea, _translated_textareas ){
1374
-
1375
- var _this = this;
1376
- var changes_saved = true;
1377
- var original_textarea = _original_textarea;
1378
- /* clone the textareas here so we don;t actually modify the translated_textareas object in the TRP_Editor */
1379
- var check_translated_textareas = jQuery.extend({}, _translated_textareas);
1380
- /* make the change tracker aware of the default language textarea. we need this when editing gettext strings */
1381
- check_translated_textareas[original_textarea.attr('data-trp-language-code')] = jQuery( '#trp-original' );
1382
-
1383
- /**
1384
- * Check if there are unsaved translations in textareas.
1385
- *
1386
- * Show animation in case it does.
1387
- *
1388
- * @returns {boolean}
1389
- */
1390
- this.check_unsaved_changes = function(){
1391
-
1392
- if ( !changes_saved ){
1393
- //open other languages if unsaved changes below
1394
- if ( jQuery ( '.trp-unsaved-changes.trp-other-language').last().css( 'display' ) == 'none' ){
1395
- trpEditor.toggle_languages();
1396
- }
1397
-
1398
- jQuery ( '.trp-unsaved-changes textarea').css ( 'backgroundColor', 'red' ).animate({
1399
- backgroundColor: "#eee"
1400
- }, 1000 );
1401
- jQuery ( '#trp-unsaved-changes-warning-message').css ( 'backgroundColor', 'red' ).animate({
1402
- backgroundColor: "#fff"
1403
- }, 1000 );
1404
-
1405
- var unsaved_changes_warning_message = jQuery ( '#trp-unsaved-changes-warning-message')
1406
- unsaved_changes_warning_message.css("display","inline");
1407
- unsaved_changes_warning_message.delay(3000).fadeOut(400);
1408
-
1409
- }
1410
- return !changes_saved;
1411
- };
1412
-
1413
- /**
1414
- * Disable restrictions for saving.
1415
- */
1416
- this.mark_changes_saved = function(){
1417
- changes_saved = true;
1418
- _this.initialize();
1419
- };
1420
-
1421
- /**
1422
- * Enable restrictions for saving.
1423
- * @param key
1424
- */
1425
- this.show_unsaved_changes = function( key ){
1426
- check_translated_textareas[key].parent().addClass('trp-unsaved-changes');
1427
- };
1428
-
1429
- /**
1430
- * Stop listening for changes.
1431
- */
1432
- this.destroy = function(){
1433
- jQuery('.trp-language-text:not(.trp-default-text)').off();
1434
- };
1435
-
1436
- /**
1437
- * Change was detected in textareas.
1438
- */
1439
- this.change_detected = function(){
1440
- if( jQuery("#trp-gettext-original-textarea").is(":visible") ){
1441
- //gettext case here
1442
- if ( jQuery("#trp-gettext-original-textarea").val() == '' ){
1443
- return;
1444
- }
1445
- }
1446
- else{
1447
- //normal string case here
1448
- if ( original_textarea.val() == '' ){
1449
- return;
1450
- }
1451
- }
1452
- var id = this.id.replace( 'trp-translated-', '' );
1453
- if( id == trpEditor.original_textarea.attr('id') )
1454
- id = trpEditor.original_textarea.attr('data-trp-language-code');
1455
- jQuery( this ).off();
1456
- _this.show_unsaved_changes( id );
1457
- changes_saved = false;
1458
- };
1459
-
1460
- /**
1461
- * Set event listeners on translation textareas.
1462
- */
1463
- this.initialize = function(){
1464
-
1465
- for ( var key in check_translated_textareas ) {
1466
- check_translated_textareas[key].parent().removeClass('trp-unsaved-changes');
1467
- }
1468
- jQuery('.trp-language-text:not(.trp-default-text) textarea').off().on('input propertychange paste', _this.change_detected );
1469
- };
1470
-
1471
- /**
1472
- * Restore initial translation.
1473
- */
1474
- this.discard_changes = function( ){
1475
- var language = jQuery(this).parent().attr( 'id' ).replace( 'trp-language-', '' );
1476
-
1477
- if( jQuery("#trp-gettext-original-textarea").is(":visible") ){
1478
- //gettext case here
1479
- var original = jQuery("#trp-gettext-original-textarea").val();
1480
- for ( var i in gettext_dictionaries[language] ){
1481
- if ( gettext_dictionaries[language][i].original.trim() == jQuery("#trp-gettext-original-textarea").val().trim() ){
1482
- string = gettext_dictionaries[language][i];
1483
- }
1484
- }
1485
- }
1486
- else{
1487
- //normal string case here
1488
- var dictionaries = trpEditor.get_dictionaries();
1489
- var original = original_textarea.val();
1490
- var string = dictionaries[language].get_string_by_original(original);
1491
- }
1492
- check_translated_textareas[language].val( string.translated ).change();
1493
- check_translated_textareas[language].on('input propertychange paste', _this.change_detected );
1494
- check_translated_textareas[language].parent().removeClass('trp-unsaved-changes');
1495
- changes_saved = true;
1496
- for ( var key in check_translated_textareas ){
1497
- if ( check_translated_textareas[key].parent().hasClass( 'trp-unsaved-changes' ) ){
1498
- changes_saved = false;
1499
- }
1500
- }
1501
- };
1502
-
1503
- /**
1504
- * Set event listeners for discard changes button.
1505
- */
1506
- this.add_event_handlers = function(){
1507
- _this.initialize();
1508
- jQuery( '.trp-discard-changes' ).on('click', _this.discard_changes );
1509
-
1510
- };
1511
-
1512
- _this.add_event_handlers();
1513
- }
1514
-
1515
-
1516
-
1517
- var trpEditor;
1518
-
1519
- // Initialize the Translate Press Editor after jQuery is ready
1520
- jQuery( function() {
1521
-
1522
- trpEditor = new TRP_Editor();
1523
-
1524
- });
1525
-
1526
-
1527
-
1528
- /* handle gettext texts */
1529
- var gettext_dictionaries = null;
1530
-
1531
- /* initial load and populate the dropdown with gettext strings */
1532
- function trp_initialize_gettext() {
1533
- /* get the gettext texts ids from the page and pass them to a ajax call to construct the dictonaries */
1534
- var gettext_strings = jQuery( '#trp-preview-iframe').contents().find( '[data-trpgettextoriginal]' );
1535
- gettext_string_ids = [];
1536
- gettext_strings.each( function(){
1537
- gettext_string_ids.push( jQuery(this).attr('data-trpgettextoriginal'));
1538
- });
1539
-
1540
- jQuery.ajax({
1541
- url: trp_ajax_url,
1542
- type: 'post',
1543
- dataType: 'json',
1544
- data: {
1545
- action: 'trp_gettext_get_translations',
1546
- security: trp_localized_text['gettextgettranslationsnonce'],
1547
- language: trp_language,
1548
- gettext_string_ids: JSON.stringify( gettext_string_ids )
1549
- },
1550
- success: function (response) {
1551
- gettext_dictionaries = response;
1552
- trp_lister = new TRP_Lister( gettext_dictionaries[trp_language] );
1553
- trp_lister.add_gettext_strings();
1554
- jQuery( '#trp-string-saved-ajax-loader' ).css('display', 'none');
1555
- },
1556
- error: function(errorThrown){
1557
- console.log( 'TranslatePress AJAX Request Error' );
1558
- jQuery( '#trp-string-saved-ajax-loader' ).css('display', 'none');
1559
- }
1560
-
1561
- });
1562
-
1563
- /* handle clicking the edit icon on gettext strings */
1564
- trp_lister = new TRP_Lister( [] );
1565
- jQuery(jQuery( '#trp-preview-iframe').contents()).on( 'mouseenter', '[data-trpgettextoriginal]', function(){
1566
- if( gettext_dictionaries == null )
1567
- return;//the strings haven't been loaded so don't do nothing yet
1568
-
1569
- gettext_string = this;
1570
-
1571
- if ( ! trpEditor.edit_translation_button ){
1572
- trpEditor.edit_translation_button = jQuery( trp_action_button_html );
1573
- }
1574
- trpEditor.edit_translation_button.children( ).removeClass( 'trp-active-icon' );
1575
- trpEditor.maybe_overflow_fix(trpEditor.edit_translation_button);
1576
-
1577
- if ( jQuery(this).attr( 'type' ) == 'submit' || jQuery(this).attr( 'type' ) == 'button' || jQuery(this).attr('type') == 'search' || jQuery(this).attr('placeholder') || jQuery(this).attr('alt')) {
1578
- if( jQuery(this).parent('trp-wrap').length == 0 )
1579
- jQuery(this).wrap('<trp-wrap class="trpgettext-wrap"></trp-wrap>');
1580
- jQuery(this).parent().prepend(trpEditor.edit_translation_button);
1581
- }
1582
- else {
1583
- jQuery(this).prepend(trpEditor.edit_translation_button);
1584
- }
1585
- trpEditor.make_sure_pencil_icon_is_inside_view ( jQuery(this)[0] );
1586
- trpEditor.edit_translation_button.off( 'click' );
1587
- trpEditor.edit_translation_button.on( 'click', function(e){
1588
- // remove highlighting of possibly highlighted new translation block
1589
- trpEditor.preview_iframe.contents().find('.trp-highlight.trp-create-translation-block').removeClass('trp-highlight trp-create-translation-block');
1590
- e.preventDefault();
1591
- e.stopPropagation();
1592
- trp_lister.set_texts_select_to_gettext( jQuery(gettext_string) );
1593
- });
1594
- jQuery( this ).addClass( 'trp-highlight' );
1595
-
1596
- });
1597
-
1598
- jQuery(jQuery( '#trp-preview-iframe').contents()).on( 'mouseleave', '[data-trpgettextoriginal]', function(){
1599
- jQuery( this ).removeClass( 'trp-highlight' );
1600
- });
1601
-
1602
- }
1603
-
1604
- jQuery(function(){
1605
-
1606
- jQuery( "#trp-preview-iframe" ).load( trp_initialize_gettext );
1607
- jQuery( "#trp-preview-iframe" ).on( 'trp_page_loaded', trp_initialize_gettext );
1608
-
1609
- /* handle saving gettext strings */
1610
- jQuery( '#trp-editor' ).on( 'click', '#trp-save-gettext', function(){
1611
- strings_to_save = {};
1612
- modified = false;
1613
- original = jQuery('#trp-gettext-original-textarea').val();
1614
- if ( original != "" ) {
1615
-
1616
- jQuery( '#trp-editor textarea[data-trp-translate-id]' ).each( function(){
1617
- id = jQuery(this).attr('data-trp-translate-id');
1618
- language = jQuery(this).attr('data-trp-language-code');
1619
- if( trp_language == language ){
1620
- gettext_id_in_dom = id;
1621
- }
1622
- translated = jQuery(this).val();
1623
- jQuery.each(gettext_dictionaries[language], function(i, string){
1624
- if( string.id == id ){
1625
- if ( string.translated != translated ) {
1626
- modified = true;
1627
- gettext_dictionaries[language][i].translated = translated;
1628
- var status = 2;
1629
- if (translated.trim() == '') {
1630
- status = 0;
1631
- }
1632
- if (typeof strings_to_save[language] == 'undefined') {
1633
- strings_to_save[language] = [];
1634
- }
1635
-
1636
- if( !domain )
1637
- domain = 'default';
1638
-
1639
- strings_to_save[language].push({id: id, original: original, translated: translated, domain: domain, status: status});
1640
- }
1641
- }
1642
- });
1643
- });
1644
- }
1645
-
1646
- if ( modified ){
1647
- trpEditor.saving_translation_ui();
1648
- jQuery.ajax({
1649
- url: trp_ajax_url,
1650
- type: 'post',
1651
- dataType: 'json',
1652
- data: {
1653
- action: 'trp_gettext_save_translations',
1654
- security: trp_localized_text['gettextsavetranslationsnonce'],
1655
- gettext_strings: JSON.stringify( strings_to_save )
1656
- },
1657
- success: function (response) {
1658
- if(gettext_id_in_dom) {
1659
- jQuery.get(document.getElementById("trp-preview-iframe").contentWindow.location.href, function (response) {
1660
- replacement = jQuery(response).find('[data-trpgettextoriginal="' + gettext_id_in_dom + '"]').first();
1661
- if( replacement.length != 0 )
1662
- jQuery('#trp-preview-iframe').contents().find('[data-trpgettextoriginal="' + gettext_id_in_dom + '"]').replaceWith(replacement);
1663
- trpEditor.saved_translation_ui();
1664
- });
1665
- }
1666
- else
1667
- trpEditor.saved_translation_ui();
1668
- },
1669
- error: function(errorThrown){
1670
- console.log( 'TranslatePress AJAX Request Error' );
1671
- }
1672
- });
1673
- }else{
1674
- trpEditor.saved_translation_ui();
1675
- }
1676
- });
1677
-
1678
- });
1679
-
1680
- jQuery( function(){
1681
- trpEditor.jquery_string_selector.on('trpSelectorNotChanged', function(){
1682
- if( !jQuery('#trp-preview').hasClass('trp-still-loading-strings') ) {
1683
- jQuery('#trp-preview').addClass('trp-still-loading-strings');
1684
- setTimeout(function () {
1685
- jQuery('#trp-preview').removeClass('trp-still-loading-strings')
1686
- }, 2000 );
1687
- }
1688
- });
1689
-
1690
- // WooCommerce compatibility. Sometimes wc_fragments were cached in the editor.
1691
- window.sessionStorage.removeItem('wc_fragments');
1692
- });
1693
-
1694
-
1695
- /**
1696
- * Return given text converted to html.
1697
- *
1698
- * Useful for decoding special characters into displayable form.
1699
- *
1700
- * @param html
1701
- * @returns {*}
1702
- */
1703
- function decode_html( html ) {
1704
- var txt = document.createElement( "textarea" );
1705
- txt.innerHTML = html;
1706
- return txt.value;
1707
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/trp-editor.js CHANGED
@@ -679,7 +679,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _uti
679
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
680
 
681
  "use strict";
682
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _translation_input_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./translation-input.vue */ \"./assets/src/js/components/translation-input.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['selectedIndexesArray', 'dictionary', 'currentLanguage', 'onScreenLanguage', 'languageNames', 'settings', 'showChangesUnsavedMessage', 'editorStrings', 'flagsPath', 'iframe'],\n data: function data() {\n return {\n languages: [],\n completeLanguageNames: Object.assign({\n 'original': 'Original String'\n }, this.languageNames),\n othersButtonPositionOffset: 1,\n showOtherLanguages: false,\n orderedLanguages: [],\n showImageIcon: true\n };\n },\n components: {\n translationInput: _translation_input_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n mounted: function mounted() {\n this.determineLanguageOrder();\n this.addKeyboardShortcutsListener();\n },\n updated: function updated() {\n // place the cursor in the first textarea or input for translation\n var translationSection = document.getElementById('trp-translation-section');\n\n if (translationSection) {\n var focusableSelectors = ['textarea:not([readonly])', 'input[type=\"text\"]:not([readonly])'];\n\n for (var i = 0; i < focusableSelectors.length; i++) {\n var focusable = document.getElementById('trp-translation-section').querySelector(focusableSelectors[i]);\n\n if (focusable) {\n focusable.focus();\n break;\n }\n }\n }\n },\n watch: {\n selectedIndexesArray: function selectedIndexesArray() {\n this.updateLanguages();\n },\n onScreenLanguage: function onScreenLanguage() {\n this.determineLanguageOrder();\n this.updateLanguages();\n }\n },\n computed: {\n othersButtonPosition: function othersButtonPosition() {\n if (this.currentLanguage === this.settings['default-language'] || this.settings['translation-languages'].length <= 2) {\n // don't display it\n return 999;\n } else {\n return this.othersButtonPositionOffset;\n }\n }\n },\n methods: {\n determineLanguageOrder: function determineLanguageOrder() {\n var self = this;\n var filteredLanguages = this.settings['translation-languages'].filter(function (language, index, array) {\n // all languages except default and current or on screen language.\n return self.settings['default-language'] !== language && self.onScreenLanguage !== language;\n });\n this.orderedLanguages = [];\n this.orderedLanguages.push(this.settings['default-language']);\n if (this.onScreenLanguage !== '') this.orderedLanguages.push(this.onScreenLanguage);\n this.orderedLanguages = this.orderedLanguages.concat(filteredLanguages);\n },\n updateLanguages: function updateLanguages() {\n this.languages = [];\n var self = this;\n var defaultLanguage = this.settings['default-language'];\n var translateToDefault = false;\n this.showImageIcon = false;\n this.othersButtonPositionOffset = 1;\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].translationsArray[defaultLanguage]) translateToDefault = true;\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].attribute === 'src') self.showImageIcon = true;\n });\n\n if (translateToDefault) {\n this.languages.push('original');\n this.othersButtonPositionOffset++;\n }\n\n this.languages = this.languages.concat(this.orderedLanguages);\n },\n discardChanges: function discardChanges(selectedIndex, languageCode) {\n this.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation = this.dictionary[selectedIndex].translationsArray[languageCode].translated;\n this.$emit('discarded-changes');\n },\n hasUnsavedChanges: function hasUnsavedChanges(selectedIndex, languageCode) {\n return this.dictionary[selectedIndex].translationsArray[languageCode].translated !== this.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation;\n },\n discardAll: function discardAll() {\n var self = this;\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n self.settings['translation-languages'].forEach(function (languageCode) {\n if (self.dictionary[selectedIndex].translationsArray[languageCode] && self.dictionary[selectedIndex].translationsArray[languageCode].translated !== self.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation) {\n self.discardChanges(selectedIndex, languageCode);\n }\n });\n });\n\n if (this.$parent.mergingString === true) {\n this.$parent.selectedString = null;\n var previouslyHighlighted = this.iframe.getElementsByClassName('trp-create-translation-block');\n\n if (previouslyHighlighted.length > 0) {\n var i;\n\n for (i = 0; i < previouslyHighlighted.length; i++) {\n previouslyHighlighted[i].classList.remove('trp-highlight');\n previouslyHighlighted[i].classList.remove('trp-create-translation-block');\n }\n }\n\n this.$parent.mergingString = false;\n this.$parent.mergeData = [];\n }\n },\n addKeyboardShortcutsListener: function addKeyboardShortcutsListener() {\n document.addEventListener(\"keydown\", function (e) {\n // CTRL + ALT + Z\n if ((window.navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) && e.altKey && e.keyCode === 90) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_discard_all_changes_event'));\n }\n }, false);\n window.addEventListener('trp_trigger_discard_all_changes_event', this.discardAll);\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vYXNzZXRzL3NyYy9qcy9jb21wb25lbnRzL2xhbmd1YWdlLWJveGVzLnZ1ZT80OWJjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDQTtBQUNBO0FBQ0EsVUFDQSxzQkFEQSxFQUVBLFlBRkEsRUFHQSxpQkFIQSxFQUlBLGtCQUpBLEVBS0EsZUFMQSxFQU1BLFVBTkEsRUFPQSwyQkFQQSxFQVFBLGVBUkEsRUFTQSxXQVRBLEVBVUEsUUFWQSxDQURBO0FBYUEsTUFiQSxrQkFhQTtBQUNBO0FBQ0EsbUJBREE7QUFFQTtBQUFBO0FBQUEsNEJBRkE7QUFHQSxtQ0FIQTtBQUlBLCtCQUpBO0FBS0EsMEJBTEE7QUFNQTtBQU5BO0FBUUEsR0F0QkE7QUF1QkE7QUFDQTtBQURBLEdBdkJBO0FBMEJBLFNBMUJBLHFCQTBCQTtBQUNBO0FBQ0E7QUFDQSxHQTdCQTtBQThCQSxTQTlCQSxxQkE4QkE7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQTNDQTtBQTRDQTtBQUNBO0FBQ0E7QUFDQSxLQUhBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFQQSxHQTVDQTtBQXFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FIQSxNQUdBO0FBQ0E7QUFDQTtBQUNBO0FBUkEsR0FyREE7QUErREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FIQTtBQUlBO0FBQ0E7QUFDQSx3Q0FDQTtBQUNBO0FBQ0EsS0FaQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQSxpSEFDQTtBQUNBLGtHQUNBO0FBQ0EsT0FMQTs7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBbENBO0FBbUNBO0FBQ0E7QUFDQTtBQUNBLEtBdENBO0FBdUNBO0FBQ0E7QUFDQSxLQXpDQTtBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUNBLDhKQURBLEVBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FMQTtBQU1BLE9BUEE7O0FBU0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQWxFQTtBQW1FQSxnQ0FuRUEsMENBbUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQSxFQU1BLEtBTkE7QUFRQTtBQUNBO0FBN0VBO0FBL0RBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL2Fzc2V0cy9zcmMvanMvY29tcG9uZW50cy9sYW5ndWFnZS1ib3hlcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gICAgPGRpdiBpZD1cInRycC10cmFuc2xhdGlvbi1zZWN0aW9uXCIgY2xhc3M9XCJ0cnAtY29udHJvbHMtc2VjdGlvbi1jb250ZW50XCIgdi1pZj1cInNlbGVjdGVkSW5kZXhlc0FycmF5XCI+XHJcbiAgICAgICAgPGRpdiB2LXNob3c9XCJzaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlXCIgY2xhc3M9XCJ0cnAtY2hhbmdlcy11bnNhdmVkLW1lc3NhZ2VcIj57eyBlZGl0b3JTdHJpbmdzLnVuc2F2ZWRfY2hhbmdlcyB9fSA8c3BhbiBjbGFzcz1cInRycC11bnNhdmVkLWNoYW5nZXMgdHJwLWRpc2NhcmQtY2hhbmdlcyBcIkBjbGljaz1cImRpc2NhcmRBbGxcIiA6dGl0bGU9XCJlZGl0b3JTdHJpbmdzLmRpc2NhcmRfYWxsX3RpdGxlX2F0dHJcIj57eyBlZGl0b3JTdHJpbmdzLmRpc2NhcmRfYWxsIH19PC9zcGFuPj88L2Rpdj5cclxuICAgICAgICA8ZGl2IHYtZm9yPVwiKGxhbmd1YWdlQ29kZSwga2V5KSBpbiBsYW5ndWFnZXNcIiA6aWQ9XCIndHJwLWxhbmd1YWdlLScgKyBsYW5ndWFnZUNvZGVcIj5cclxuICAgICAgICAgICAgPGRpdiB2LXNob3c9XCIoIChrZXkgPD0gb3RoZXJzQnV0dG9uUG9zaXRpb24pIHx8IHNob3dPdGhlckxhbmd1YWdlcyApICYmICggc2VsZWN0ZWRJbmRleGVzQXJyYXkgJiYgc2VsZWN0ZWRJbmRleGVzQXJyYXkubGVuZ3RoID4gMCApXCIgIGNsYXNzPVwidHJwLWxhbmd1YWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1sYW5ndWFnZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImtleSA9PSAwIFwiPnt7IGVkaXRvclN0cmluZ3MuZnJvbSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1lbHNlPnt7IGVkaXRvclN0cmluZ3MudG8gfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbXBsZXRlTGFuZ3VhZ2VOYW1lc1tsYW5ndWFnZUNvZGVdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyB2LWlmPVwibGFuZ3VhZ2VDb2RlICE9ICdvcmlnaW5hbCdcIiBjbGFzcz1cInRycC1sYW5ndWFnZS1ib3gtZmxhZy1pbWFnZVwiIDpzcmM9XCJmbGFnc1BhdGggKyAnLycgKyBsYW5ndWFnZUNvZGUgKyAnLnBuZydcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTJcIiA6YWx0PVwibGFuZ3VhZ2VDb2RlXCIgOnRpdGxlPVwiY29tcGxldGVMYW5ndWFnZU5hbWVzW2xhbmd1YWdlQ29kZV1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidHJwLXRyYW5zbGF0aW9ucy1mb3ItbGFuZ3VhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0cnAtdHJhbnNsYXRpb24taWNvbi1jb250YWluZXJcIiB2LWlmPVwic2hvd0ltYWdlSWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRycC10cmFuc2xhdGlvbi1pY29uIGRhc2hpY29ucyBkYXNoaWNvbnMtZm9ybWF0LWltYWdlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidHJwLXRyYW5zbGF0aW9ucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1zdHJpbmctY29udGFpbmVyXCIgdi1mb3I9XCJzZWxlY3RlZEluZGV4IGluIHNlbGVjdGVkSW5kZXhlc0FycmF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmIGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXVwiIDprZXk9XCJzZWxlY3RlZEluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zbGF0aW9uLWlucHV0IDpzdHJpbmc9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXCIgdi1tb2RlbD1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS5lZGl0ZWRUcmFuc2xhdGlvblwiIDpoaWdobGlnaHRVbnNhdmVkQ2hhbmdlcz1cInNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2UgJiYgaGFzVW5zYXZlZENoYW5nZXMoIHNlbGVjdGVkSW5kZXgsIGxhbmd1YWdlQ29kZSApXCIgOmVkaXRvclN0cmluZ3M9XCJlZGl0b3JTdHJpbmdzXCI+PC90cmFuc2xhdGlvbi1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXCIgOmtleT1cInNlbGVjdGVkSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNsYXRpb24taW5wdXQgOnJlYWRvbmx5PVwidHJ1ZVwiIDpzdHJpbmc9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXCIgOnZhbHVlPVwiZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5vcmlnaW5hbFwiIDplZGl0b3JTdHJpbmdzPVwiZWRpdG9yU3RyaW5nc1wiPjwvdHJhbnNsYXRpb24taW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnAtdHJhbnNsYXRpb24taW5wdXQtZm9vdGVyXCIgOmRhdGEtZGljdGlvbmFyeS1lbnRyeT1cIkpTT04uc3RyaW5naWZ5KGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1hdHRyaWJ1dGUtbmFtZVwiICB2LXNob3c9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLmF0dHJpYnV0ZSAhPSAnY29udGVudCcgfHwgZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgIT0gJydcIj57eyAoIGVkaXRvclN0cmluZ3NbIGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0uYXR0cmlidXRlIF0gKSA/IGVkaXRvclN0cmluZ3NbIGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0uYXR0cmlidXRlIF0gOiBlZGl0b3JTdHJpbmdzLnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmIGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXVwiIGNsYXNzPVwidHJwLWRpc2NhcmQtY2hhbmdlcyB0cnAtZGlzY2FyZC1pbmRpdmlkdWFsLWNoYW5nZXNcIiBAY2xpY2s9XCJkaXNjYXJkQ2hhbmdlcyhzZWxlY3RlZEluZGV4LGxhbmd1YWdlQ29kZSlcIiA6Y2xhc3M9XCJ7J3RycC11bnNhdmVkLWNoYW5nZXMnOiBoYXNVbnNhdmVkQ2hhbmdlcyggc2VsZWN0ZWRJbmRleCwgbGFuZ3VhZ2VDb2RlICkgfVwiIDp0aXRsZT1cImVkaXRvclN0cmluZ3MuZGlzY2FyZF9pbmRpdmlkdWFsX2NoYW5nZXNfdGl0bGVfYXR0cmlidXRlXCI+e3sgZWRpdG9yU3RyaW5ncy5kaXNjYXJkIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtc2hvdz1cImtleSA9PSBvdGhlcnNCdXR0b25Qb3NpdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnAtdG9nZ2xlLWxhbmd1YWdlc1wiIEBjbGljaz1cInNob3dPdGhlckxhbmd1YWdlcyA9ICFzaG93T3RoZXJMYW5ndWFnZXNcIiA6Y2xhc3M9XCJ7ICd0cnAtc2hvdy1vdGhlci1sYW5ndWFnZXMnOiBzaG93T3RoZXJMYW5ndWFnZXMsICd0cnAtaGlkZS1vdGhlci1sYW5ndWFnZXMnOiAhc2hvd090aGVyTGFuZ3VhZ2VzIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKHNob3dPdGhlckxhbmd1YWdlcyk/ICcmIzExMjA2OycgOiAnJiMxMTIwODsnIH19IHt7IGVkaXRvclN0cmluZ3Mub3RoZXJfbGFuZyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdD5cclxuICAgIGltcG9ydCB0cmFuc2xhdGlvbklucHV0IGZyb20gJy4vdHJhbnNsYXRpb24taW5wdXQudnVlJ1xyXG4gICAgZXhwb3J0IGRlZmF1bHR7XHJcbiAgICAgICAgcHJvcHM6W1xyXG4gICAgICAgICAgICAnc2VsZWN0ZWRJbmRleGVzQXJyYXknLFxyXG4gICAgICAgICAgICAnZGljdGlvbmFyeScsXHJcbiAgICAgICAgICAgICdjdXJyZW50TGFuZ3VhZ2UnLFxyXG4gICAgICAgICAgICAnb25TY3JlZW5MYW5ndWFnZScsXHJcbiAgICAgICAgICAgICdsYW5ndWFnZU5hbWVzJyxcclxuICAgICAgICAgICAgJ3NldHRpbmdzJyxcclxuICAgICAgICAgICAgJ3Nob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAnZWRpdG9yU3RyaW5ncycsXHJcbiAgICAgICAgICAgICdmbGFnc1BhdGgnLFxyXG4gICAgICAgICAgICAnaWZyYW1lJ1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZGF0YSgpe1xyXG4gICAgICAgICAgICByZXR1cm57XHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZXMgICAgICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgY29tcGxldGVMYW5ndWFnZU5hbWVzICAgICAgOiBPYmplY3QuYXNzaWduKCB7ICdvcmlnaW5hbCc6ICdPcmlnaW5hbCBTdHJpbmcnIH0sIHRoaXMubGFuZ3VhZ2VOYW1lcyApLFxyXG4gICAgICAgICAgICAgICAgb3RoZXJzQnV0dG9uUG9zaXRpb25PZmZzZXQgOiAxLFxyXG4gICAgICAgICAgICAgICAgc2hvd090aGVyTGFuZ3VhZ2VzICAgICAgICAgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9yZGVyZWRMYW5ndWFnZXMgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICAgICAgICBzaG93SW1hZ2VJY29uICAgICAgICAgICAgICA6IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcG9uZW50czp7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uSW5wdXRcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1vdW50ZWQoKXtcclxuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVMYW5ndWFnZU9yZGVyKClcclxuICAgICAgICAgICAgdGhpcy5hZGRLZXlib2FyZFNob3J0Y3V0c0xpc3RlbmVyKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZWQoKXtcclxuICAgICAgICAgICAgLy8gcGxhY2UgdGhlIGN1cnNvciBpbiB0aGUgZmlyc3QgdGV4dGFyZWEgb3IgaW5wdXQgZm9yIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2xhdGlvblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RycC10cmFuc2xhdGlvbi1zZWN0aW9uJyApXHJcbiAgICAgICAgICAgIGlmICggdHJhbnNsYXRpb25TZWN0aW9uICkgIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb2N1c2FibGVTZWxlY3RvcnMgPSBbJ3RleHRhcmVhOm5vdChbcmVhZG9ubHldKScsICdpbnB1dFt0eXBlPVwidGV4dFwiXTpub3QoW3JlYWRvbmx5XSknXVxyXG4gICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpPGZvY3VzYWJsZVNlbGVjdG9ycy5sZW5ndGg7IGkrKyApe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c2FibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RycC10cmFuc2xhdGlvbi1zZWN0aW9uJyApLnF1ZXJ5U2VsZWN0b3IoZm9jdXNhYmxlU2VsZWN0b3JzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggZm9jdXNhYmxlICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGUuZm9jdXMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdhdGNoOiB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSW5kZXhlc0FycmF5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlcygpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uU2NyZWVuTGFuZ3VhZ2U6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVybWluZUxhbmd1YWdlT3JkZXIoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZXMoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wdXRlZDp7XHJcbiAgICAgICAgICAgIG90aGVyc0J1dHRvblBvc2l0aW9uOiBmdW5jdGlvbiAoKXtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZSA9PT0gdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddIHx8IHRoaXMuc2V0dGluZ3NbJ3RyYW5zbGF0aW9uLWxhbmd1YWdlcyddLmxlbmd0aCA8PSAyICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vdGhlcnNCdXR0b25Qb3NpdGlvbk9mZnNldFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRob2RzOntcclxuICAgICAgICAgICAgZGV0ZXJtaW5lTGFuZ3VhZ2VPcmRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRMYW5ndWFnZXMgPSB0aGlzLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5maWx0ZXIoZnVuY3Rpb24obGFuZ3VhZ2UsIGluZGV4LCBhcnJheSl7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxhbmd1YWdlcyBleGNlcHQgZGVmYXVsdCBhbmQgY3VycmVudCBvciBvbiBzY3JlZW4gbGFuZ3VhZ2UuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggc2VsZi5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddICE9PSBsYW5ndWFnZSApICYmICggc2VsZi5vblNjcmVlbkxhbmd1YWdlICE9PSBsYW5ndWFnZSApXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJlZExhbmd1YWdlcyA9IFtdXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyZWRMYW5ndWFnZXMucHVzaCggdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddIClcclxuICAgICAgICAgICAgICAgIGlmICggdGhpcy5vblNjcmVlbkxhbmd1YWdlICE9PSAnJyApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlcmVkTGFuZ3VhZ2VzLnB1c2goIHRoaXMub25TY3JlZW5MYW5ndWFnZSApXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyZWRMYW5ndWFnZXMgPSB0aGlzLm9yZGVyZWRMYW5ndWFnZXMuY29uY2F0KCBmaWx0ZXJlZExhbmd1YWdlcyApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZUxhbmd1YWdlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMgICAgICAgICAgICAgICAgICA9IFtdXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpc1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRMYW5ndWFnZSAgICAgICAgICAgICA9IHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXVxyXG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZVRvRGVmYXVsdCAgICAgICAgICA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dJbWFnZUljb24gICAgICAgICAgICAgID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJzQnV0dG9uUG9zaXRpb25PZmZzZXQgPSAxXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3RlZEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSAmJiBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbZGVmYXVsdExhbmd1YWdlXSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVRvRGVmYXVsdCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICBpZiggc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmIHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgPT09ICdzcmMnIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93SW1hZ2VJY29uID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlVG9EZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMucHVzaCgnb3JpZ2luYWwnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3RoZXJzQnV0dG9uUG9zaXRpb25PZmZzZXQrK1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZXMuY29uY2F0KHRoaXMub3JkZXJlZExhbmd1YWdlcylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzY2FyZENoYW5nZXM6IGZ1bmN0aW9uKHNlbGVjdGVkSW5kZXgsbGFuZ3VhZ2VDb2RlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLmVkaXRlZFRyYW5zbGF0aW9uID0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0udHJhbnNsYXRlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnZGlzY2FyZGVkLWNoYW5nZXMnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBoYXNVbnNhdmVkQ2hhbmdlczogZnVuY3Rpb24oc2VsZWN0ZWRJbmRleCwgbGFuZ3VhZ2VDb2RlKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0udHJhbnNsYXRlZCAhPT0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0uZWRpdGVkVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRpc2NhcmRBbGw6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkuZm9yRWFjaChmdW5jdGlvbihzZWxlY3RlZEluZGV4KXtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5mb3JFYWNoKCBmdW5jdGlvbiggbGFuZ3VhZ2VDb2RlICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLnRyYW5zbGF0ZWQgIT09IHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLmVkaXRlZFRyYW5zbGF0aW9uKSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzY2FyZENoYW5nZXMoc2VsZWN0ZWRJbmRleCxsYW5ndWFnZUNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuJHBhcmVudC5tZXJnaW5nU3RyaW5nID09PSB0cnVlICl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LnNlbGVjdGVkU3RyaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQgPSB0aGlzLmlmcmFtZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCAndHJwLWNyZWF0ZS10cmFuc2xhdGlvbi1ibG9jaycgKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQubGVuZ3RoID4gMCApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQubGVuZ3RoOyBpKysgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5SGlnaGxpZ2h0ZWRbaV0uY2xhc3NMaXN0LnJlbW92ZSgndHJwLWhpZ2hsaWdodCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5SGlnaGxpZ2h0ZWRbaV0uY2xhc3NMaXN0LnJlbW92ZSgndHJwLWNyZWF0ZS10cmFuc2xhdGlvbi1ibG9jaycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50Lm1lcmdpbmdTdHJpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5tZXJnZURhdGEgPSBbXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhZGRLZXlib2FyZFNob3J0Y3V0c0xpc3RlbmVyKCl7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIFpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goXCJNYWNcIikgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXkpICYmIGUuYWx0S2V5ICYmIGUua2V5Q29kZSA9PT0gOTAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd0cnBfdHJpZ2dlcl9kaXNjYXJkX2FsbF9jaGFuZ2VzX2V2ZW50JykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RycF90cmlnZ2VyX2Rpc2NhcmRfYWxsX2NoYW5nZXNfZXZlbnQnLCB0aGlzLmRpc2NhcmRBbGwgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG48L3NjcmlwdD5cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/components/language-boxes.vue?vue&type=script&lang=js&\n");
683
 
684
  /***/ }),
685
 
@@ -715,7 +715,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var he__
715
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
716
 
717
  "use strict";
718
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! select2/dist/js/select2.min.js */ \"./node_modules/select2/dist/js/select2.min.js\");\n/* harmony import */ var select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./assets/src/js/utils.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_language_boxes_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/language-boxes.vue */ \"./assets/src/js/components/language-boxes.vue\");\n/* harmony import */ var _components_save_translations_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/save-translations.vue */ \"./assets/src/js/components/save-translations.vue\");\n/* harmony import */ var _components_hover_actions_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/hover-actions.vue */ \"./assets/src/js/components/hover-actions.vue\");\n/* harmony import */ var _components_extra_content_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/extra-content.vue */ \"./assets/src/js/components/extra-content.vue\");\n/* harmony import */ var he__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! he */ \"./node_modules/he/he.js\");\n/* harmony import */ var he__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(he__WEBPACK_IMPORTED_MODULE_7__);\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['trp_settings', 'language_names', 'ordered_secondary_languages', 'current_language', 'on_screen_language', 'view_as_roles', 'url_to_load', 'string_selectors', 'data_attributes', 'ajax_url', 'editor_nonces', 'string_group_order', 'merge_rules', 'localized_text', 'paid_version', 'flags_path'],\n components: {\n languageBoxes: _components_language_boxes_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n saveTranslations: _components_save_translations_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n hoverActions: _components_hover_actions_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n extraContent: _components_extra_content_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n },\n data: function data() {\n return {\n //props\n settings: JSON.parse(this.trp_settings),\n languageNames: JSON.parse(this.language_names),\n orderedSecondaryLanguages: JSON.parse(this.ordered_secondary_languages),\n roles: JSON.parse(this.view_as_roles),\n nonces: JSON.parse(this.editor_nonces),\n stringGroupOrder: JSON.parse(this.string_group_order),\n selectors: JSON.parse(this.string_selectors),\n dataAttributes: JSON.parse(this.data_attributes),\n mergeRules: JSON.parse(this.merge_rules),\n editorStrings: JSON.parse(this.localized_text),\n //data\n currentLanguage: this.current_language,\n onScreenLanguage: this.on_screen_language,\n currentURL: this.url_to_load,\n urlToLoad: this.url_to_load,\n iframe: '',\n dictionary: [],\n selectedString: null,\n selectedIndexesArray: [],\n detectedSelectorAndId: [],\n stringGroups: [],\n mergingString: false,\n mergeData: [],\n showChangesUnsavedMessage: false,\n viewAs: '',\n loading_strings: 0,\n translationNotLoadedYet: false\n };\n },\n created: function created() {\n this.settings['default-language-name'] = this.languageNames[this.settings['default-language']]; //set default value for the View As select\n\n var params = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getUrlParameters(this.currentURL);\n if (Object.keys(params).length > 1 && params['trp-view-as']) this.viewAs = params['trp-view-as'];else this.viewAs = 'current_user';\n },\n mounted: function mounted() {\n this.addKeyboardShortcutsListener();\n var self = this; // initialize select2\n\n jQuery('#trp-language-select, #trp-view-as-select').select2({\n width: '100%'\n }); //init strings dropdown\n\n this.stringsDropdownLoading(); // show overlay when select is opened\n\n jQuery('#trp-language-select, #trp-string-categories').on('select2:open', function () {\n jQuery('#trp_select2_overlay').fadeIn('100');\n }).on('select2:close', function () {\n jQuery('#trp_select2_overlay').hide();\n }).on('select2:opening', function (e) {\n /* when we have unsaved changes prevent the strings dropdown from opening so we do not have a disconnect between the textareas and the dropdown */\n if (self.hasUnsavedChanges()) {\n e.preventDefault();\n }\n }); // resize sidebar and consequently the iframe\n\n var previewContainer = jQuery('#trp-preview');\n var total_width = jQuery(window).width();\n jQuery('#trp-controls').resizable({\n start: function start() {\n previewContainer.toggle();\n },\n stop: function stop() {\n previewContainer.toggle();\n },\n handles: 'e',\n minWidth: 285,\n maxWidth: total_width - 20\n }).bind(\"resize\", this.resizeIframe); // resize iframe when resizing window\n\n jQuery(window).resize(function () {\n self.resizeIframe();\n });\n },\n watch: {\n currentLanguage: function currentLanguage(_currentLanguage) {\n var self = this; //grab the correct URL from the iFrame\n\n var newURL = this.iframe.querySelector('link[hreflang=\"' + _currentLanguage.replace('_', '-') + '\"]').getAttribute('href');\n this.currentURL = newURL;\n this.iframe.location = newURL; //reset vue props\n\n this.selectedString = '';\n this.selectedIndexesArray = []; //set strings dropdown to loading state\n\n jQuery('#trp-string-categories').val('').trigger('change');\n this.stringsDropdownLoading();\n this.onScreenLanguage = _currentLanguage;\n\n if (this.settings['default-language'] == this.currentLanguage && this.settings['translation-languages'].length > 1) {\n this.settings['translation-languages'].some(function (language) {\n if (language != self.settings['default-language']) {\n // return the first language not default\n self.onScreenLanguage = language;\n return true;\n }\n });\n }\n },\n currentURL: function currentURL(newUrl, oldUrl) {\n window.history.replaceState(null, null, this.parentURL(newUrl));\n },\n viewAs: function viewAs(role) {\n if (!this.currentURL || !this.iframe) return;\n var url = this.cleanURL(this.currentURL);\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-edit-translation', 'preview');\n\n if (role == 'current_user') {\n this.iframe.location = url;\n return;\n } //if nonce not available, an update to the Browse as Other Roles add-on is required\n\n\n if (!this.nonces[role]) {\n alert(this.editorStrings.bor_update_notice);\n return;\n }\n\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-view-as', role);\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-view-as-nonce', this.nonces[role]);\n this.iframe.location = url;\n },\n selectedString: function selectedString(selectedStringArrayIndex, oldString) {\n if (this.hasUnsavedChanges() || !selectedStringArrayIndex && selectedStringArrayIndex !== 0) return;\n jQuery('#trp-string-categories').val(selectedStringArrayIndex !== null ? selectedStringArrayIndex : '').trigger('change');\n var selectedString = this.dictionary[selectedStringArrayIndex];\n if (!selectedString) return;\n var currentNode = this.iframe.querySelector(\"[\" + selectedString.selector + \"='\" + selectedString.dbID + \"']\");\n var selectedIndexesArray = []; //when merging we do not have a valid current node, so we just add the fake id\n\n if (currentNode) {\n var self = this;\n var selectors = self.getAllSelectors();\n var nodes = [];\n nodes.push(currentNode);\n\n if (currentNode.tagName != \"A\") {\n // include the anchor's translatable attributes\n var anchorParent = currentNode.closest('a');\n\n if (anchorParent != null) {\n nodes.push(anchorParent);\n }\n }\n\n if (currentNode.tagName == \"A\" && currentNode.children.length > 0) {\n // include all the translatable attributes inside the anchor\n var childrenArray = _toConsumableArray(currentNode.children);\n\n childrenArray.forEach(function (child) {\n nodes.push(child);\n });\n }\n\n nodes.forEach(function (node) {\n selectors.forEach(function (selector) {\n var stringId = node.getAttribute(selector);\n\n if (stringId) {\n var found = false;\n var i;\n\n for (i = 0; i < selectedIndexesArray.length; i++) {\n if (typeof self.dictionary[selectedIndexesArray[i]] !== 'undefined' && self.dictionary[selectedIndexesArray[i]].dbID !== 'undefined' && self.dictionary[selectedIndexesArray[i]].dbID === stringId) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n selectedIndexesArray.push(self.getStringIndex(selector, stringId));\n }\n }\n });\n });\n } else selectedIndexesArray.push(selectedStringArrayIndex);\n\n this.selectedIndexesArray = selectedIndexesArray;\n }\n },\n computed: {\n closeURL: function closeURL() {\n return this.cleanURL(this.currentURL);\n }\n },\n methods: {\n iFrameLoaded: function iFrameLoaded() {\n var self = this;\n var iframeElement = document.querySelector('#trp-preview-iframe');\n this.iframe = iframeElement.contentDocument || iframeElement.contentWindow.document; //sync iFrame URL with parent\n\n if (this.currentURL != this.iframe.URL) this.currentURL = this.iframe.URL; //hide iFrame loader\n\n this.iframeLoader('hide');\n self.detectedSelectorAndId = [];\n self.dictionary = [];\n this.scanIframeForStrings();\n window.addEventListener('trp_iframe_page_updated', this.scanIframeForStrings); //event that is fired when the iFrame is navigated\n\n iframeElement.contentWindow.onbeforeunload = function () {\n self.iframeLoader('show');\n self.selectedString = null;\n self.selectedIndexesArray = [];\n self.translationNotLoadedYet = false;\n self.stringsDropdownLoading();\n };\n },\n scanIframeForStrings: function scanIframeForStrings() {\n this.scanForSelector('data-trp-translate-id', 'regular', this.onScreenLanguage);\n this.scanForSelector('data-trpgettextoriginal', 'gettext', this.currentLanguage);\n this.scanForSelector('data-trp-post-slug', 'postslug', this.currentLanguage);\n },\n scanForSelector: function scanForSelector(baseSelector, typeSlug, languageOfIds) {\n this.loading_strings++;\n var self = this;\n var selectors = this.prepareSelectorStrings(baseSelector);\n\n var nodes = _toConsumableArray(this.iframe.querySelectorAll('[' + selectors.join('],[') + ']'));\n\n var stringIdsArray = [],\n nodeData = [],\n nodeEntries = [];\n nodes.forEach(function (node) {\n nodeEntries = self.getNodeInfo(node, baseSelector);\n nodeEntries.forEach(function (entry) {\n // this check ensures that we don't create duplicates when rescanning after ajax complete\n if (!self.alreadyDetected(entry.selector, entry.dbID)) {\n stringIdsArray.push(entry.dbID);\n nodeData.push(entry);\n }\n });\n self.setupEventListener(node);\n }); //unique ids only\n\n stringIdsArray = _toConsumableArray(new Set(stringIdsArray));\n\n if (stringIdsArray.length > 0) {\n var data = new FormData();\n data.append('action', 'trp_get_translations_' + typeSlug);\n data.append('all_languages', 'true');\n data.append('security', this.nonces['gettranslationsnonce' + typeSlug]);\n data.append('language', languageOfIds);\n data.append('string_ids', JSON.stringify(stringIdsArray));\n axios__WEBPACK_IMPORTED_MODULE_2___default.a.post(this.ajax_url, data).then(function (response) {\n self.loading_strings--;\n self.addToDictionary(response.data, nodeData);\n })[\"catch\"](function (error) {\n console.log(error);\n });\n } else {\n self.loading_strings--;\n }\n },\n alreadyDetected: function alreadyDetected(selector, dbId) {\n var combined = selector + '=' + dbId;\n\n if (_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].arrayContainsItem(this.detectedSelectorAndId, combined)) {\n return true;\n } else {\n this.detectedSelectorAndId.push(combined);\n return false;\n }\n },\n setupEventListener: function setupEventListener(node) {\n if (node.tagName == 'A' && !node.hasAttribute('data-trpgettextoriginal')) return false;\n var self = this;\n node.addEventListener('mouseenter', self.$refs.hoverActions.showPencilIcon);\n },\n addToDictionary: function addToDictionary(responseData) {\n var nodeInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var self = this;\n\n if (responseData != null) {\n if (nodeInfo) {\n nodeInfo.forEach(function (infoRow, index) {\n responseData.some(function (responseDataRow) {\n if (infoRow.dbID == responseDataRow.dbID) {\n //bring block_type to the top level object\n if (responseDataRow.type != 'gettext' && typeof responseDataRow.block_type == 'undefined') {\n var firstLanguage = self.orderedSecondaryLanguages[0];\n if (typeof responseDataRow.translationsArray[firstLanguage].block_type != 'undefined') responseDataRow.block_type = responseDataRow.translationsArray[firstLanguage].block_type;\n }\n\n nodeInfo[index] = Object.assign({}, responseDataRow, infoRow);\n return true; // a sort of break\n }\n });\n });\n } else {\n nodeInfo = responseData;\n }\n\n this.stringGroups = this.addToStringGroups(nodeInfo);\n this.dictionary = this.dictionary.concat(nodeInfo);\n this.initStringsDropdown();\n }\n },\n addToStringGroups: function addToStringGroups(strings) {\n // see what node groups are found\n var foundStringGroups = this.stringGroups;\n strings.forEach(function (string) {\n if (foundStringGroups.indexOf(string.group) === -1 && (typeof string.blockType === 'undefined' || string.blockType !== '2')) {\n foundStringGroups.push(string.group);\n }\n }); // put the node groups in the order that we want, according to the prop this.stringGroupOrder\n\n var orderedStringGroups = [];\n\n if (this.editorStrings.seo_update_notice != 'seo_pack_update_not_needed') {\n orderedStringGroups.push(this.editorStrings.seo_update_notice);\n }\n\n this.stringGroupOrder.forEach(function (group) {\n if (foundStringGroups.indexOf(group) !== -1) {\n orderedStringGroups.push(group);\n }\n }); // if there were any other string groups that were not in the prop, add them at the end.\n\n foundStringGroups.forEach(function (group) {\n if (orderedStringGroups.indexOf(group) === -1) {\n orderedStringGroups.push(group);\n }\n });\n return orderedStringGroups;\n },\n getStringIndex: function getStringIndex(selector, dbID) {\n var found = null;\n this.dictionary.some(function (string, index) {\n if (string.dbID == dbID && string.selector == selector) {\n found = index;\n return true;\n }\n });\n return found;\n },\n getNodeInfo: function getNodeInfo(node) {\n var baseSelector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var stringId;\n var nodeData = [];\n var selectors = this.prepareSelectorStrings(baseSelector);\n selectors.forEach(function (selector) {\n stringId = node.getAttribute(selector);\n\n if (stringId) {\n var nodeAttribute = selector.replace(baseSelector, '');\n var nodeGroup = node.getAttribute('data-trp-node-group' + nodeAttribute);\n var nodeDescription = node.getAttribute('data-trp-node-description' + nodeAttribute);\n var entry = {\n dbID: stringId,\n selector: selector,\n attribute: nodeAttribute.substr(1) // substr(1) is used to trim prefixing line - ex. -alt will result in alt (no line)\n\n };\n if (nodeGroup) entry.group = nodeGroup;\n if (nodeDescription) entry.description = nodeDescription;\n nodeData.push(entry);\n }\n });\n return nodeData;\n },\n getAllSelectors: function getAllSelectors() {\n var selectors = [];\n var self = this;\n this.dataAttributes.forEach(function (dataAttribute) {\n selectors = selectors.concat(self.prepareSelectorStrings(dataAttribute));\n });\n return selectors;\n },\n prepareSelectorStrings: function prepareSelectorStrings(baseNameSelector) {\n var parsed_selectors = [];\n this.selectors.forEach(function (selectorSuffix, index) {\n parsed_selectors.push(baseNameSelector + selectorSuffix);\n });\n return parsed_selectors;\n },\n parentURL: function parentURL(url) {\n return url.replace('trp-edit-translation=preview', 'trp-edit-translation=true');\n },\n cleanURL: function cleanURL(url) {\n //make removeUrlParameter recursive and only call it once with all the parameters that\n //need to stripped ?\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'lang');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-view-as');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-view-as-nonce');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-edit-translation');\n return url;\n },\n showString: function showString(string, type) {\n if (typeof string.blockType !== 'undefined' && string.blockType === '2') {\n // don't show deprecated translation blocks in the dropdown\n return false;\n }\n\n if (type === this.editorStrings.images && typeof string.attribute != 'undefined' && string.attribute == 'src') return true;\n if (typeof string.attribute !== 'undefined' && (string.attribute == 'href' || string.attribute == 'src')) return false;\n if (string.group === type) return true;\n return false;\n },\n initStringsDropdown: function initStringsDropdown() {\n var self = this;\n\n if (!this.isStringsDropdownOpen()) {\n jQuery('#trp-string-categories').select2('destroy');\n jQuery('#trp-string-categories').select2({\n placeholder: self.editorStrings.select_string,\n templateResult: function templateResult(option) {\n var original = he__WEBPACK_IMPORTED_MODULE_7___default.a.decode(option.text.substring(0, 90)) + (option.text.length <= 90 ? '' : '...');\n var description = option.title ? '(' + option.title + ')' : '';\n return jQuery('<div>' + original + '</div><div class=\"string-selector-description\">' + description + '</div>');\n },\n width: '100%'\n }).prop('disabled', false);\n jQuery('#trp_select2_overlay').hide();\n }\n },\n stringsDropdownLoading: function stringsDropdownLoading() {\n jQuery('#trp-string-categories').select2({\n placeholder: this.editorStrings.strings_loading,\n width: '100%'\n }).prop('disabled', true);\n },\n processOptionName: function processOptionName(name, type) {\n if (type == 'Images') return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getFilename(name);\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].escapeHtml(name);\n },\n isStringsDropdownOpen: function isStringsDropdownOpen() {\n return jQuery('#trp-string-categories').select2('isOpen');\n },\n hasUnsavedChanges: function hasUnsavedChanges() {\n var unsavedChanges = false;\n var self = this;\n\n if (this.selectedIndexesArray.length > 0) {\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n self.settings['translation-languages'].forEach(function (languageCode) {\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].translationsArray[languageCode] && self.dictionary[selectedIndex].translationsArray[languageCode].translated !== self.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation) {\n unsavedChanges = true;\n }\n });\n });\n }\n\n this.showChangesUnsavedMessage = unsavedChanges;\n return unsavedChanges;\n },\n iframeLoader: function iframeLoader(status) {\n var loader = document.getElementById('trp-preview-loader');\n if (status == 'show') loader.style.display = 'flex';else if (status == 'hide') loader.style.display = 'none';\n },\n previousString: function previousString() {\n var currentValue = document.getElementById('trp-string-categories').value;\n var newValue = +currentValue - 1;\n\n while (newValue >= 0 && document.querySelectorAll('#trp-string-categories option[value=\"' + newValue + '\"]').length === 0) {\n newValue--;\n }\n\n if (newValue < 0) return;\n this.selectedString = newValue.toString();\n },\n nextString: function nextString() {\n var currentValue = document.getElementById('trp-string-categories').value,\n newValue = 0;\n if (currentValue != '') newValue = +currentValue + 1;\n\n while (newValue < this.dictionary.length && document.querySelectorAll('#trp-string-categories option[value=\"' + newValue + '\"]').length === 0) {\n newValue++;\n }\n\n if (newValue >= this.dictionary.length) {\n return;\n }\n\n this.selectedString = newValue.toString();\n },\n addKeyboardShortcutsListener: function addKeyboardShortcutsListener() {\n document.addEventListener(\"keydown\", function (e) {\n if ((window.navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) && e.altKey) {\n // CTRL + ALT + right arrow\n if (e.keyCode === 39) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_next_string_event'));\n } else {\n // CTRL + ALT + left arrow\n if (e.keyCode === 37) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_previous_string_event'));\n }\n }\n }\n }, false);\n window.addEventListener('trp_trigger_next_string_event', this.nextString);\n window.addEventListener('trp_trigger_previous_string_event', this.previousString);\n },\n resizeIframe: function resizeIframe(event, ui) {\n var total_width = jQuery(window).width();\n var width = jQuery('#trp-controls').width();\n\n if (width > total_width) {\n width = total_width;\n controls.css('width', width);\n }\n\n var previewContainer = jQuery('#trp-preview');\n previewContainer.css('right', width);\n previewContainer.css('left', width - 348);\n previewContainer.css('width', total_width - width);\n }\n },\n //add support for v-model in select2\n directives: {\n select2: {\n inserted: function inserted(el) {\n jQuery(el).on('select2:select', function () {\n var event = new Event('change', {\n bubbles: true,\n cancelable: true\n });\n el.dispatchEvent(event);\n });\n jQuery(el).on('select2:unselect', function () {\n var event = new Event('change', {\n bubbles: true,\n cancelable: true\n });\n el.dispatchEvent(event);\n });\n }\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vYXNzZXRzL3NyYy9qcy9lZGl0b3IudnVlP2E3NjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLFVBQ0EsY0FEQSxFQUVBLGdCQUZBLEVBR0EsNkJBSEEsRUFJQSxrQkFKQSxFQUtBLG9CQUxBLEVBTUEsZUFOQSxFQU9BLGFBUEEsRUFRQSxrQkFSQSxFQVNBLGlCQVRBLEVBVUEsVUFWQSxFQVdBLGVBWEEsRUFZQSxvQkFaQSxFQWFBLGFBYkEsRUFjQSxnQkFkQSxFQWVBLGNBZkEsRUFnQkEsWUFoQkEsQ0FEQTtBQW1CQTtBQUNBLHlGQURBO0FBRUEsK0ZBRkE7QUFHQSx1RkFIQTtBQUlBO0FBSkEsR0FuQkE7QUF5QkEsTUF6QkEsa0JBeUJBO0FBQ0E7QUFDQTtBQUNBLDZDQUZBO0FBR0Esb0RBSEE7QUFJQSw2RUFKQTtBQUtBLDJDQUxBO0FBTUEsNENBTkE7QUFPQSwyREFQQTtBQVFBLGtEQVJBO0FBU0Esc0RBVEE7QUFVQSw4Q0FWQTtBQVdBLG9EQVhBO0FBWUE7QUFDQSw0Q0FiQTtBQWNBLCtDQWRBO0FBZUEsa0NBZkE7QUFnQkEsaUNBaEJBO0FBaUJBLGdCQWpCQTtBQWtCQSxvQkFsQkE7QUFtQkEsMEJBbkJBO0FBb0JBLDhCQXBCQTtBQXFCQSwrQkFyQkE7QUFzQkEsc0JBdEJBO0FBdUJBLDBCQXZCQTtBQXdCQSxtQkF4QkE7QUF5QkEsc0NBekJBO0FBMEJBLGdCQTFCQTtBQTJCQSx3QkEzQkE7QUE0QkE7QUE1QkE7QUE4QkEsR0F4REE7QUF5REEsU0F6REEscUJBeURBO0FBQ0EsbUdBREEsQ0FHQTs7QUFDQTtBQUVBLGlFQUNBLG9DQURBLEtBR0E7QUFDQSxHQW5FQTtBQW9FQSxTQXBFQSxxQkFvRUE7QUFDQTtBQUNBLG9CQUZBLENBR0E7O0FBQ0E7QUFBQTtBQUFBLE9BSkEsQ0FNQTs7QUFDQSxrQ0FQQSxDQVNBOztBQUNBO0FBQ0E7QUFDQSxLQUZBLEVBRUEsRUFGQSxDQUVBLGVBRkEsRUFFQTtBQUNBO0FBQ0EsS0FKQSxFQUlBLEVBSkEsQ0FJQSxpQkFKQSxFQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQVRBLEVBVkEsQ0FxQkE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBLE9BREE7QUFFQTtBQUFBO0FBQUEsT0FGQTtBQUdBLGtCQUhBO0FBSUEsbUJBSkE7QUFLQTtBQUxBLE9BTUEsSUFOQSxDQU1BLFFBTkEsRUFNQSxpQkFOQSxFQXhCQSxDQWdDQTs7QUFDQTtBQUNBO0FBQ0EsS0FGQTtBQUdBLEdBeEdBO0FBeUdBO0FBQ0E7QUFDQSxzQkFEQSxDQUVBOztBQUNBO0FBRUE7QUFDQSxvQ0FOQSxDQVFBOztBQUNBO0FBQ0EscUNBVkEsQ0FZQTs7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQU5BO0FBT0E7QUFDQSxLQTNCQTtBQTRCQTtBQUNBO0FBQ0EsS0E5QkE7QUErQkE7QUFDQSw0Q0FDQTtBQUVBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FYQSxDQWFBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQSxLQXREQTtBQXVEQTtBQUVBLG1HQUNBO0FBRUE7QUFFQTtBQUVBLDJCQUNBO0FBRUE7QUFDQSxvQ0FiQSxDQWVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0EsV0FGQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FmQTtBQWdCQSxTQWpCQTtBQWtCQSxPQTFDQSxNQTJDQTs7QUFFQTtBQUNBO0FBckhBLEdBekdBO0FBZ09BO0FBQ0E7QUFDQTtBQUNBO0FBSEEsR0FoT0E7QUFxT0E7QUFDQSxnQkFEQSwwQkFDQTtBQUNBO0FBQ0E7QUFFQSwwRkFKQSxDQU1BOztBQUNBLDhDQUNBLGtDQVJBLENBVUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQSxvRkFqQkEsQ0FtQkE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsT0FSQTtBQVVBLEtBL0JBO0FBZ0NBLHdCQWhDQSxrQ0FnQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQXBDQTtBQXFDQSxtQkFyQ0EsMkJBcUNBLFlBckNBLEVBcUNBLFFBckNBLEVBcUNBLGFBckNBLEVBcUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQU5BO0FBUUE7QUFDQSxPQVpBLEVBUEEsQ0FxQkE7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSwrRUFDQSxJQURBLENBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FKQSxXQUtBO0FBQ0E7QUFDQSxTQVBBO0FBUUEsT0FoQkEsTUFnQkE7QUFDQTtBQUNBO0FBRUEsS0FoRkE7QUFpRkEsbUJBakZBLDJCQWlGQSxRQWpGQSxFQWlGQSxJQWpGQSxFQWlGQTtBQUNBOztBQUNBO0FBQ0E7QUFDQSxPQUZBLE1BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQXpGQTtBQTBGQSxzQkExRkEsOEJBMEZBLElBMUZBLEVBMEZBO0FBQ0EsZ0ZBQ0E7QUFFQTtBQUVBO0FBQ0EsS0FqR0E7QUFrR0EsbUJBbEdBLDJCQWtHQSxZQWxHQSxFQWtHQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLHlHQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFWQSxDQVVBO0FBQ0E7QUFDQSxhQWRBO0FBZUEsV0FoQkE7QUFpQkEsU0FsQkEsTUFrQkE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EsS0FqSUE7QUFrSUEscUJBbElBLDZCQWtJQSxPQWxJQSxFQWtJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BSkEsRUFKQSxDQVVBOztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BSkEsRUFqQkEsQ0F1QkE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUpBO0FBTUE7QUFDQSxLQWpLQTtBQWtLQSxrQkFsS0EsMEJBa0tBLFFBbEtBLEVBa0tBLElBbEtBLEVBa0tBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQTtBQU9BO0FBQ0EsS0E3S0E7QUE4S0EsZUE5S0EsdUJBOEtBLElBOUtBLEVBOEtBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQSwwQkFEQTtBQUVBLDhCQUZBO0FBR0EsOENBSEEsQ0FHQTs7QUFIQTtBQU1BLHlCQUNBO0FBRUEsK0JBQ0E7QUFFQTtBQUNBO0FBRUEsT0F6QkE7QUEyQkE7QUFDQSxLQS9NQTtBQWdOQSxtQkFoTkEsNkJBZ05BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQSxPQUZBO0FBSUE7QUFDQSxLQXpOQTtBQTBOQSwwQkExTkEsa0NBME5BLGdCQTFOQSxFQTBOQTtBQUNBO0FBRUE7QUFDQTtBQUNBLE9BRkE7QUFJQTtBQUNBLEtBbE9BO0FBbU9BLGFBbk9BLHFCQW1PQSxHQW5PQSxFQW1PQTtBQUNBO0FBQ0EsS0FyT0E7QUFzT0EsWUF0T0Esb0JBc09BLEdBdE9BLEVBc09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQSxLQS9PQTtBQWdQQSxjQWhQQSxzQkFnUEEsTUFoUEEsRUFnUEEsSUFoUEEsRUFnUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxxSEFDQTtBQUVBLGdIQUNBO0FBRUEsaUNBQ0E7QUFFQTtBQUNBLEtBL1BBO0FBZ1FBLHVCQWhRQSxpQ0FnUUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsV0FMQTtBQUtBO0FBTEEsV0FLQSxJQUxBLENBS0EsVUFMQSxFQUtBLEtBTEE7QUFPQTtBQUNBO0FBQ0EsS0EvUUE7QUFnUkEsMEJBaFJBLG9DQWdSQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsS0FsUkE7QUFtUkEscUJBblJBLDZCQW1SQSxJQW5SQSxFQW1SQSxJQW5SQSxFQW1SQTtBQUNBLDRCQUNBO0FBRUE7QUFDQSxLQXhSQTtBQXlSQSx5QkF6UkEsbUNBeVJBO0FBQ0E7QUFDQSxLQTNSQTtBQTRSQSxxQkE1UkEsK0JBNFJBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFDQSw4REFEQSxJQUVBLDhKQUZBLEVBRUE7QUFDQTtBQUNBO0FBQ0EsV0FOQTtBQU9BLFNBUkE7QUFTQTs7QUFDQTtBQUVBO0FBQ0EsS0E3U0E7QUE4U0EsZ0JBOVNBLHdCQThTQSxNQTlTQSxFQThTQTtBQUNBO0FBRUEsNEJBQ0EsOEJBREEsS0FFQSxzQkFDQTtBQUNBLEtBclRBO0FBc1RBLGtCQXRUQSw0QkFzVEE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFDQTtBQUVBO0FBQ0EsS0FuVUE7QUFvVUEsY0FwVUEsd0JBb1VBO0FBQ0E7QUFBQTtBQUVBLDhCQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQW5WQTtBQW9WQSxnQ0FwVkEsMENBb1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FIQSxNQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQWRBLEVBY0EsS0FkQTtBQWdCQTtBQUNBO0FBQ0EsS0F2V0E7QUF3V0EsZ0JBeFdBLHdCQXdXQSxLQXhXQSxFQXdXQSxFQXhXQSxFQXdXQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBYQSxHQXJPQTtBQTJsQkE7QUFDQTtBQUNBO0FBQ0EsY0FEQSxvQkFDQSxFQURBLEVBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQSxTQUhBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0EsU0FIQTtBQUlBO0FBWEE7QUFEQTtBQTVsQkEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vYXNzZXRzL3NyYy9qcy9lZGl0b3IudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICAgIDxkaXYgaWQ9XCJ0cnAtZWRpdG9yXCI+XHJcblxyXG4gICAgICAgIDxkaXYgaWQ9XCJ0cnAtY29udHJvbHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1jb250cm9scy1jb250YWluZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLWNsb3NlLXNhdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cInRycC1jb250cm9scy1jbG9zZVwiIDpocmVmPVwiY2xvc2VVUkxcIiA6dGl0bGU9XCJlZGl0b3JTdHJpbmdzLmNsb3NlXCI+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtc2F2ZS1hbmQtbG9hZGVyLXNwaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnAtYWpheC1sb2FkZXJcIiB2LXNob3c9XCJsb2FkaW5nX3N0cmluZ3MgPiAwXCIgaWQ9XCJ0cnAtc3RyaW5nLXNhdmVkLWFqYXgtbG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2F2ZS10cmFuc2xhdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c2VsZWN0ZWRJbmRleGVzQXJyYXk9XCJzZWxlY3RlZEluZGV4ZXNBcnJheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpY3Rpb25hcnk9XCJkaWN0aW9uYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c2V0dGluZ3M9XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm5vbmNlcz1cIm5vbmNlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmFqYXhfdXJsPVwiYWpheF91cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjdXJyZW50TGFuZ3VhZ2U9XCJjdXJyZW50TGFuZ3VhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvblNjcmVlbkxhbmd1YWdlPVwib25TY3JlZW5MYW5ndWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlmcmFtZT1cImlmcmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmN1cnJlbnRVUkw9XCJjdXJyZW50VVJMXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVyZ2luZ1N0cmluZz1cIm1lcmdpbmdTdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXJnZURhdGE9XCJtZXJnZURhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0cmFuc2xhdGlvbnMtc2F2ZWQ9XCJzaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplZGl0b3JTdHJpbmdzPVwiZWRpdG9yU3RyaW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zYXZlLXRyYW5zbGF0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnAtY29udHJvbHMtc2VjdGlvblwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLWNvbnRyb2xzLXNlY3Rpb24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLWxhbmd1YWdlLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInRycC1sYW5ndWFnZS1zZWxlY3RcIiBuYW1lPVwibGFuZ1wiIHYtbW9kZWw9XCJjdXJyZW50TGFuZ3VhZ2VcIiB2LXNlbGVjdDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIihsYW5nLCBsYW5nSW5kZXgpIGluIGxhbmd1YWdlTmFtZXNcIiA6dmFsdWU9XCJsYW5nSW5kZXhcIj57e2xhbmd9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInRycC1zdHJpbmctbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInRycC1zdHJpbmctY2F0ZWdvcmllc1wiIHYtbW9kZWw9XCJzZWxlY3RlZFN0cmluZ1wiIHYtc2VsZWN0Mj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgdi1mb3I9XCIoZ3JvdXApIGluIHN0cmluZ0dyb3Vwc1wiIDpsYWJlbD1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCIoc3RyaW5nLCBpbmRleCkgaW4gZGljdGlvbmFyeVwiIDp2YWx1ZT1cImluZGV4XCIgdi1pZj1cInNob3dTdHJpbmcoIHN0cmluZywgZ3JvdXAgKVwiIDp0aXRsZT1cInN0cmluZy5kZXNjcmlwdGlvblwiIDpkYXRhLWRhdGFiYXNlLWlkPVwic3RyaW5nLmRiSURcIiA6ZGF0YS1ncm91cD1cInN0cmluZy5ncm91cFwiPnt7IHByb2Nlc3NPcHRpb25OYW1lKCBzdHJpbmcub3JpZ2luYWwsIGdyb3VwICkgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInRycC1uZXh0LXByZXZpb3VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cInRycC1wcmV2aW91c1wiIGNsYXNzPVwidHJwLW5leHQtcHJldmlvdXMtYnV0dG9uc1wiIHYtb246Y2xpY2s9XCJwcmV2aW91c1N0cmluZygpXCIgOnRpdGxlPVwiZWRpdG9yU3RyaW5ncy5wcmV2aW91c190aXRsZV9hdHRyXCI+PHNwYW4+JmxhcXVvOzwvc3Bhbj4ge3sgZWRpdG9yU3RyaW5ncy5wcmV2aW91cyB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJ0cnAtbmV4dFwiIGNsYXNzPVwidHJwLW5leHQtcHJldmlvdXMtYnV0dG9uc1wiIHYtb246Y2xpY2s9XCJuZXh0U3RyaW5nKClcIiA6dGl0bGU9XCJlZGl0b3JTdHJpbmdzLm5leHRfdGl0bGVfYXR0clwiPnt7IGVkaXRvclN0cmluZ3MubmV4dCB9fSA8c3Bhbj4mcmFxdW87PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtdmlldy1hc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInRycC12aWV3LWFzLWRlc2NyaXB0aW9uXCI+e3sgZWRpdG9yU3RyaW5ncy52aWV3X2FzIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwidHJwLXZpZXctYXMtc2VsZWN0XCIgdi1tb2RlbD1cInZpZXdBc1wiIHYtc2VsZWN0Mj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiKHJvbGUsIHJvbGVJbmRleCkgaW4gcm9sZXNcIiA6dmFsdWU9XCJyb2xlXCIgOmRpc2FibGVkPVwiIXJvbGVcIiA6dGl0bGU9XCIhcm9sZSA/IGVkaXRvclN0cmluZ3Mudmlld19hc19wcm8gOiAnJ1wiPnt7cm9sZUluZGV4fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIiB2LXNob3c9XCJzZWxlY3RlZFN0cmluZyAhPT0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYW5ndWFnZS1ib3hlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkSW5kZXhlc0FycmF5PVwic2VsZWN0ZWRJbmRleGVzQXJyYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpY3Rpb25hcnk9XCJkaWN0aW9uYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjdXJyZW50TGFuZ3VhZ2U9XCJjdXJyZW50TGFuZ3VhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9uU2NyZWVuTGFuZ3VhZ2U9XCJvblNjcmVlbkxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpsYW5ndWFnZU5hbWVzPVwibGFuZ3VhZ2VOYW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c2V0dGluZ3M9XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZT1cInNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGRpc2NhcmRlZC1jaGFuZ2VzPVwiaGFzVW5zYXZlZENoYW5nZXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZWRpdG9yU3RyaW5ncz1cImVkaXRvclN0cmluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZsYWdzUGF0aD1cImZsYWdzX3BhdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlmcmFtZT1cImlmcmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFuZ3VhZ2UtYm94ZXM+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZXh0cmEtY29udGVudCA6bGFuZ3VhZ2VOYW1lcz1cImxhbmd1YWdlTmFtZXNcIiA6ZWRpdG9yU3RyaW5ncz1cImVkaXRvclN0cmluZ3NcIiA6cGFpZFZlcnNpb249XCJwYWlkX3ZlcnNpb25cIj48L2V4dHJhLWNvbnRlbnQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1jb250cm9scy1zZWN0aW9uXCIgdi1zaG93PVwidHJhbnNsYXRpb25Ob3RMb2FkZWRZZXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLXRyYW5zbGF0aW9uLW5vdC1yZWFkeS1zZWN0aW9uXCIgY2xhc3M9XCJ0cnAtY29udHJvbHMtc2VjdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIHYtaHRtbD1cImVkaXRvclN0cmluZ3MudHJhbnNsYXRpb25fbm90X2xvYWRlZF95ZXRcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwidHJwX3NlbGVjdDJfb3ZlcmxheVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGhvdmVyLWFjdGlvbnNcclxuICAgICAgICAgICAgICAgIHJlZj1cImhvdmVyQWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICA6ZGljdGlvbmFyeT1cImRpY3Rpb25hcnlcIlxyXG4gICAgICAgICAgICAgICAgOnNldHRpbmdzPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgOmlmcmFtZT1cImlmcmFtZVwiXHJcbiAgICAgICAgICAgICAgICA6ZGF0YUF0dHJpYnV0ZXM9XCJkYXRhQXR0cmlidXRlc1wiXHJcbiAgICAgICAgICAgICAgICA6bWVyZ2VSdWxlcz1cIm1lcmdlUnVsZXNcIlxyXG4gICAgICAgICAgICAgICAgOm5vbmNlcz1cIm5vbmNlc1wiXHJcbiAgICAgICAgICAgICAgICA6YWpheF91cmw9XCJhamF4X3VybFwiXHJcbiAgICAgICAgICAgICAgICA6bWVyZ2VEYXRhPVwibWVyZ2VEYXRhXCJcclxuICAgICAgICAgICAgICAgIDplZGl0b3JTdHJpbmdzPVwiZWRpdG9yU3RyaW5nc1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9ob3Zlci1hY3Rpb25zPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidHJwLXByZXZpZXdcIj5cclxuICAgICAgICAgICAgPGlmcmFtZSBpZD1cInRycC1wcmV2aWV3LWlmcmFtZVwiIDpzcmM9XCJ1cmxUb0xvYWRcIiB2LW9uOmxvYWQ9XCJpRnJhbWVMb2FkZWRcIj48L2lmcmFtZT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtcHJldmlldy1sb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ0cnAtbG9hZGVyXCIgd2lkdGg9XCI2NXB4XCIgaGVpZ2h0PVwiNjVweFwiIHZpZXdCb3g9XCIwIDAgNjYgNjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInRycC1jaXJjbGVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgY3g9XCIzM1wiIGN5PVwiMzNcIiByPVwiMzBcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdD5cclxuICAgIGltcG9ydCAnc2VsZWN0Mi9kaXN0L2pzL3NlbGVjdDIubWluLmpzJ1xyXG4gICAgaW1wb3J0IHV0aWxzICAgICAgICAgICAgZnJvbSAnLi91dGlscydcclxuICAgIGltcG9ydCBheGlvcyAgICAgICAgICAgIGZyb20gJ2F4aW9zJ1xyXG4gICAgaW1wb3J0IGxhbmd1YWdlQm94ZXMgICAgZnJvbSAnLi9jb21wb25lbnRzL2xhbmd1YWdlLWJveGVzLnZ1ZSdcclxuICAgIGltcG9ydCBzYXZlVHJhbnNsYXRpb25zIGZyb20gJy4vY29tcG9uZW50cy9zYXZlLXRyYW5zbGF0aW9ucy52dWUnXHJcbiAgICBpbXBvcnQgaG92ZXJBY3Rpb25zICAgICBmcm9tICcuL2NvbXBvbmVudHMvaG92ZXItYWN0aW9ucy52dWUnXHJcbiAgICBpbXBvcnQgZXh0cmFDb250ZW50ICAgICBmcm9tICcuL2NvbXBvbmVudHMvZXh0cmEtY29udGVudC52dWUnXHJcbiAgICBpbXBvcnQgaGUgICAgICAgICAgICAgICBmcm9tICdoZSdcclxuXHJcbiAgICBleHBvcnQgZGVmYXVsdCB7XHJcbiAgICAgICAgcHJvcHM6IFtcclxuICAgICAgICAgICAgJ3RycF9zZXR0aW5ncycsXHJcbiAgICAgICAgICAgICdsYW5ndWFnZV9uYW1lcycsXHJcbiAgICAgICAgICAgICdvcmRlcmVkX3NlY29uZGFyeV9sYW5ndWFnZXMnLFxyXG4gICAgICAgICAgICAnY3VycmVudF9sYW5ndWFnZScsXHJcbiAgICAgICAgICAgICdvbl9zY3JlZW5fbGFuZ3VhZ2UnLFxyXG4gICAgICAgICAgICAndmlld19hc19yb2xlcycsXHJcbiAgICAgICAgICAgICd1cmxfdG9fbG9hZCcsXHJcbiAgICAgICAgICAgICdzdHJpbmdfc2VsZWN0b3JzJyxcclxuICAgICAgICAgICAgJ2RhdGFfYXR0cmlidXRlcycsXHJcbiAgICAgICAgICAgICdhamF4X3VybCcsXHJcbiAgICAgICAgICAgICdlZGl0b3Jfbm9uY2VzJyxcclxuICAgICAgICAgICAgJ3N0cmluZ19ncm91cF9vcmRlcicsXHJcbiAgICAgICAgICAgICdtZXJnZV9ydWxlcycsXHJcbiAgICAgICAgICAgICdsb2NhbGl6ZWRfdGV4dCcsXHJcbiAgICAgICAgICAgICdwYWlkX3ZlcnNpb24nLFxyXG4gICAgICAgICAgICAnZmxhZ3NfcGF0aCdcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvbXBvbmVudHM6e1xyXG4gICAgICAgICAgICBsYW5ndWFnZUJveGVzLFxyXG4gICAgICAgICAgICBzYXZlVHJhbnNsYXRpb25zLFxyXG4gICAgICAgICAgICBob3ZlckFjdGlvbnMsXHJcbiAgICAgICAgICAgIGV4dHJhQ29udGVudFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGF0YSgpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLy9wcm9wc1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MgICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoIHRoaXMudHJwX3NldHRpbmdzICksXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZU5hbWVzICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5sYW5ndWFnZV9uYW1lcyApLFxyXG4gICAgICAgICAgICAgICAgb3JkZXJlZFNlY29uZGFyeUxhbmd1YWdlcyA6IEpTT04ucGFyc2UoIHRoaXMub3JkZXJlZF9zZWNvbmRhcnlfbGFuZ3VhZ2VzICksXHJcbiAgICAgICAgICAgICAgICByb2xlcyAgICAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy52aWV3X2FzX3JvbGVzICksXHJcbiAgICAgICAgICAgICAgICBub25jZXMgICAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5lZGl0b3Jfbm9uY2VzKSxcclxuICAgICAgICAgICAgICAgIHN0cmluZ0dyb3VwT3JkZXIgICAgICAgICAgOiBKU09OLnBhcnNlKCB0aGlzLnN0cmluZ19ncm91cF9vcmRlciksXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcnMgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5zdHJpbmdfc2VsZWN0b3JzICksXHJcbiAgICAgICAgICAgICAgICBkYXRhQXR0cmlidXRlcyAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5kYXRhX2F0dHJpYnV0ZXMgKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlUnVsZXMgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKCB0aGlzLm1lcmdlX3J1bGVzICksXHJcbiAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5sb2NhbGl6ZWRfdGV4dCApLFxyXG4gICAgICAgICAgICAgICAgLy9kYXRhXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2UgICAgICAgICAgIDogdGhpcy5jdXJyZW50X2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgb25TY3JlZW5MYW5ndWFnZSAgICAgICAgICA6IHRoaXMub25fc2NyZWVuX2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFVSTCAgICAgICAgICAgICAgICA6IHRoaXMudXJsX3RvX2xvYWQsXHJcbiAgICAgICAgICAgICAgICB1cmxUb0xvYWQgICAgICAgICAgICAgICAgIDogdGhpcy51cmxfdG9fbG9hZCxcclxuICAgICAgICAgICAgICAgIGlmcmFtZSAgICAgICAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RyaW5nICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleGVzQXJyYXkgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgZGV0ZWN0ZWRTZWxlY3RvckFuZElkICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgc3RyaW5nR3JvdXBzICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2luZ1N0cmluZyAgICAgICAgICAgICA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VEYXRhICAgICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmlld0FzICAgICAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZ19zdHJpbmdzICAgICAgICAgICA6IDAsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk5vdExvYWRlZFlldCAgIDogZmFsc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNyZWF0ZWQoKXtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZS1uYW1lJ10gPSB0aGlzLmxhbmd1YWdlTmFtZXNbIHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXSBdXHJcblxyXG4gICAgICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgVmlldyBBcyBzZWxlY3RcclxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHV0aWxzLmdldFVybFBhcmFtZXRlcnMoIHRoaXMuY3VycmVudFVSTCApXHJcblxyXG4gICAgICAgICAgICBpZiggT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPiAxICYmIHBhcmFtc1sndHJwLXZpZXctYXMnXSApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdBcyA9IHBhcmFtc1sndHJwLXZpZXctYXMnXVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdBcyA9ICdjdXJyZW50X3VzZXInXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtb3VudGVkKCl7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5Ym9hcmRTaG9ydGN1dHNMaXN0ZW5lcigpXHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIHNlbGVjdDJcclxuICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1sYW5ndWFnZS1zZWxlY3QsICN0cnAtdmlldy1hcy1zZWxlY3QnICkuc2VsZWN0MiggeyB3aWR0aCA6ICcxMDAlJyB9KVxyXG5cclxuICAgICAgICAgICAgLy9pbml0IHN0cmluZ3MgZHJvcGRvd25cclxuICAgICAgICAgICAgdGhpcy5zdHJpbmdzRHJvcGRvd25Mb2FkaW5nKClcclxuXHJcbiAgICAgICAgICAgIC8vIHNob3cgb3ZlcmxheSB3aGVuIHNlbGVjdCBpcyBvcGVuZWRcclxuICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1sYW5ndWFnZS1zZWxlY3QsICN0cnAtc3RyaW5nLWNhdGVnb3JpZXMnICkub24oICdzZWxlY3QyOm9wZW4nLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmZhZGVJbiggJzEwMCcgKVxyXG4gICAgICAgICAgICB9KS5vbiggJ3NlbGVjdDI6Y2xvc2UnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmhpZGUoKVxyXG4gICAgICAgICAgICB9KS5vbiggJ3NlbGVjdDI6b3BlbmluZycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8qIHdoZW4gd2UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgcHJldmVudCB0aGUgc3RyaW5ncyBkcm9wZG93biBmcm9tIG9wZW5pbmcgc28gd2UgZG8gbm90IGhhdmUgYSBkaXNjb25uZWN0IGJldHdlZW4gdGhlIHRleHRhcmVhcyBhbmQgdGhlIGRyb3Bkb3duICovXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvLyByZXNpemUgc2lkZWJhciBhbmQgY29uc2VxdWVudGx5IHRoZSBpZnJhbWVcclxuICAgICAgICAgICAgbGV0IHByZXZpZXdDb250YWluZXIgPSBqUXVlcnkoICcjdHJwLXByZXZpZXcnICk7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbF93aWR0aCA9IGpRdWVyeSh3aW5kb3cpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGpRdWVyeSggJyN0cnAtY29udHJvbHMnICkucmVzaXphYmxlKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiggKSB7IHByZXZpZXdDb250YWluZXIudG9nZ2xlKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiggKSB7IHByZXZpZXdDb250YWluZXIudG9nZ2xlKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVzOiAnZScsXHJcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjg1LFxyXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRvdGFsX3dpZHRoIC0gMjBcclxuICAgICAgICAgICAgfSkuYmluZCggXCJyZXNpemVcIiwgdGhpcy5yZXNpemVJZnJhbWUgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2l6ZSBpZnJhbWUgd2hlbiByZXNpemluZyB3aW5kb3dcclxuICAgICAgICAgICAgalF1ZXJ5KCB3aW5kb3cgKS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yZXNpemVJZnJhbWUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3YXRjaDoge1xyXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2U6IGZ1bmN0aW9uKCBjdXJyZW50TGFuZ3VhZ2UgKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIC8vZ3JhYiB0aGUgY29ycmVjdCBVUkwgZnJvbSB0aGUgaUZyYW1lXHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3VVJMID0gdGhpcy5pZnJhbWUucXVlcnlTZWxlY3RvciggJ2xpbmtbaHJlZmxhbmc9XCInICsgY3VycmVudExhbmd1YWdlLnJlcGxhY2UoICdfJywgJy0nICkgKydcIl0nICkuZ2V0QXR0cmlidXRlKCdocmVmJylcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVUkwgICAgICAgICAgID0gbmV3VVJMXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZS5sb2NhdGlvbiAgICAgID0gbmV3VVJMXHJcblxyXG4gICAgICAgICAgICAgICAgLy9yZXNldCB2dWUgcHJvcHNcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdHJpbmcgICAgICAgPSAnJ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgc3RyaW5ncyBkcm9wZG93biB0byBsb2FkaW5nIHN0YXRlXHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJyN0cnAtc3RyaW5nLWNhdGVnb3JpZXMnKS52YWwoJycpLnRyaWdnZXIoJ2NoYW5nZScpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZ3NEcm9wZG93bkxvYWRpbmcoKVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25TY3JlZW5MYW5ndWFnZSA9IGN1cnJlbnRMYW5ndWFnZVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXSA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSAmJiB0aGlzLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5sZW5ndGggPiAxICl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1sndHJhbnNsYXRpb24tbGFuZ3VhZ2VzJ10uc29tZShmdW5jdGlvbihsYW5ndWFnZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGFuZ3VhZ2UgIT0gc2VsZi5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIG5vdCBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uU2NyZWVuTGFuZ3VhZ2UgPSBsYW5ndWFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGN1cnJlbnRVUkw6IGZ1bmN0aW9uICggbmV3VXJsLCBvbGRVcmwgKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG51bGwsIG51bGwsIHRoaXMucGFyZW50VVJMKCBuZXdVcmwgKSApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHZpZXdBczogZnVuY3Rpb24oIHJvbGUgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiggIXRoaXMuY3VycmVudFVSTCB8fCAhdGhpcy5pZnJhbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmNsZWFuVVJMKCB0aGlzLmN1cnJlbnRVUkwgKVxyXG5cclxuICAgICAgICAgICAgICAgIHVybCA9IHV0aWxzLnVwZGF0ZVVybFBhcmFtZXRlciggdXJsLCAndHJwLWVkaXQtdHJhbnNsYXRpb24nLCAncHJldmlldycgKVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCByb2xlID09ICdjdXJyZW50X3VzZXInICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLmxvY2F0aW9uID0gdXJsXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9pZiBub25jZSBub3QgYXZhaWxhYmxlLCBhbiB1cGRhdGUgdG8gdGhlIEJyb3dzZSBhcyBPdGhlciBSb2xlcyBhZGQtb24gaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIGlmKCAhdGhpcy5ub25jZXNbcm9sZV0gKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoIHRoaXMuZWRpdG9yU3RyaW5ncy5ib3JfdXBkYXRlX25vdGljZSApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMudXBkYXRlVXJsUGFyYW1ldGVyKCB1cmwsICd0cnAtdmlldy1hcycsIHJvbGUgKVxyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMudXBkYXRlVXJsUGFyYW1ldGVyKCB1cmwsICd0cnAtdmlldy1hcy1ub25jZScsIHRoaXMubm9uY2VzW3JvbGVdIClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZS5sb2NhdGlvbiA9IHVybFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZWxlY3RlZFN0cmluZzogZnVuY3Rpb24gKCBzZWxlY3RlZFN0cmluZ0FycmF5SW5kZXgsIG9sZFN0cmluZyApe1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzKCkgfHwgKCAhc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4ICYmIHNlbGVjdGVkU3RyaW5nQXJyYXlJbmRleCAhPT0gMCApIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnZhbCggc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4ICE9PSBudWxsID8gc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4IDogJycgKS50cmlnZ2VyKCAnY2hhbmdlJyApXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU3RyaW5nICAgICAgID0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkU3RyaW5nQXJyYXlJbmRleF1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggIXNlbGVjdGVkU3RyaW5nIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgICAgICAgICAgPSB0aGlzLmlmcmFtZS5xdWVyeVNlbGVjdG9yKCBcIltcIiArIHNlbGVjdGVkU3RyaW5nLnNlbGVjdG9yICsgXCI9J1wiICsgc2VsZWN0ZWRTdHJpbmcuZGJJRCArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEluZGV4ZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgLy93aGVuIG1lcmdpbmcgd2UgZG8gbm90IGhhdmUgYSB2YWxpZCBjdXJyZW50IG5vZGUsIHNvIHdlIGp1c3QgYWRkIHRoZSBmYWtlIGlkXHJcbiAgICAgICAgICAgICAgICBpZiggY3VycmVudE5vZGUgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdG9ycyA9IHNlbGYuZ2V0QWxsU2VsZWN0b3JzKClcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZXMgPSBbXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKCBjdXJyZW50Tm9kZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVudE5vZGUudGFnTmFtZSAhPSBcIkFcIiApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBhbmNob3IncyB0cmFuc2xhdGFibGUgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yUGFyZW50ICA9IGN1cnJlbnROb2RlLmNsb3Nlc3QoJ2EnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggIGFuY2hvclBhcmVudCAhPSBudWxsICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChhbmNob3JQYXJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVudE5vZGUudGFnTmFtZSA9PSBcIkFcIiAmJiBjdXJyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgYWxsIHRoZSB0cmFuc2xhdGFibGUgYXR0cmlidXRlcyBpbnNpZGUgdGhlIGFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5BcnJheSA9IFsgLi4uY3VycmVudE5vZGUuY2hpbGRyZW4gXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5BcnJheS5mb3JFYWNoKCBmdW5jdGlvbiAoIGNoaWxkICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChjaGlsZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCBmdW5jdGlvbiggbm9kZSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyaW5nSWQgPSBub2RlLmdldEF0dHJpYnV0ZShzZWxlY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VsZWN0ZWRJbmRleGVzQXJyYXkubGVuZ3RoOyBpKysgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhlc0FycmF5W2ldXSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhlc0FycmF5W2ldXS5kYklEICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleGVzQXJyYXlbaV1dLmRiSUQgPT09IHN0cmluZ0lkICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBmb3VuZCApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleGVzQXJyYXkucHVzaChzZWxmLmdldFN0cmluZ0luZGV4KHNlbGVjdG9yLCBzdHJpbmdJZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheS5wdXNoKCBzZWxlY3RlZFN0cmluZ0FycmF5SW5kZXggKVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkgPSBzZWxlY3RlZEluZGV4ZXNBcnJheVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICAgICAgY2xvc2VVUkw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW5VUkwoIHRoaXMuY3VycmVudFVSTCApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG1ldGhvZHM6IHtcclxuICAgICAgICAgICAgaUZyYW1lTG9hZGVkKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RycC1wcmV2aWV3LWlmcmFtZScpXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZnJhbWUgPSBpZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnRcclxuXHJcbiAgICAgICAgICAgICAgICAvL3N5bmMgaUZyYW1lIFVSTCB3aXRoIHBhcmVudFxyXG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLmN1cnJlbnRVUkwgIT0gdGhpcy5pZnJhbWUuVVJMIClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVUkwgPSB0aGlzLmlmcmFtZS5VUkxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2hpZGUgaUZyYW1lIGxvYWRlclxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZnJhbWVMb2FkZXIoICdoaWRlJyApXHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZi5kZXRlY3RlZFNlbGVjdG9yQW5kSWQgPSBbXVxyXG4gICAgICAgICAgICAgICAgc2VsZi5kaWN0aW9uYXJ5ICAgICAgICAgICAgPSBbXVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FuSWZyYW1lRm9yU3RyaW5ncygpXHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0cnBfaWZyYW1lX3BhZ2VfdXBkYXRlZCcsIHRoaXMuc2NhbklmcmFtZUZvclN0cmluZ3MgKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBpRnJhbWUgaXMgbmF2aWdhdGVkXHJcbiAgICAgICAgICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmlmcmFtZUxvYWRlciggJ3Nob3cnIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZFN0cmluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkSW5kZXhlc0FycmF5ID0gW11cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYW5zbGF0aW9uTm90TG9hZGVkWWV0ID0gZmFsc2VcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdzRHJvcGRvd25Mb2FkaW5nKClcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNjYW5JZnJhbWVGb3JTdHJpbmdzKCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5Gb3JTZWxlY3RvciggJ2RhdGEtdHJwLXRyYW5zbGF0ZS1pZCcsICdyZWd1bGFyJywgdGhpcy5vblNjcmVlbkxhbmd1YWdlIClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbkZvclNlbGVjdG9yKCAnZGF0YS10cnBnZXR0ZXh0b3JpZ2luYWwnLCAnZ2V0dGV4dCcsIHRoaXMuY3VycmVudExhbmd1YWdlIClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbkZvclNlbGVjdG9yKCAnZGF0YS10cnAtcG9zdC1zbHVnJywgJ3Bvc3RzbHVnJywgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzY2FuRm9yU2VsZWN0b3IoIGJhc2VTZWxlY3RvciwgdHlwZVNsdWcsIGxhbmd1YWdlT2ZJZHMgKXtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ19zdHJpbmdzKytcclxuICAgICAgICAgICAgICAgIGxldCBzZWxmICAgICAgICAgICA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvcnMgICAgICA9IHRoaXMucHJlcGFyZVNlbGVjdG9yU3RyaW5ncyggYmFzZVNlbGVjdG9yIClcclxuICAgICAgICAgICAgICAgIGxldCBub2RlcyAgICAgICAgICA9IFsuLi50aGlzLmlmcmFtZS5xdWVyeVNlbGVjdG9yQWxsKCAnWycgKyBzZWxlY3RvcnMuam9pbignXSxbJykgKyAnXScgKV1cclxuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdJZHNBcnJheSA9IFtdLCBub2RlRGF0YSA9IFtdLCBub2RlRW50cmllcyA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCggZnVuY3Rpb24gKCBub2RlICl7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZUVudHJpZXMgPSBzZWxmLmdldE5vZGVJbmZvKCBub2RlLCBiYXNlU2VsZWN0b3IgKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2RlRW50cmllcy5mb3JFYWNoKCBmdW5jdGlvbiggZW50cnkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgZW5zdXJlcyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBkdXBsaWNhdGVzIHdoZW4gcmVzY2FubmluZyBhZnRlciBhamF4IGNvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIXNlbGYuYWxyZWFkeURldGVjdGVkKCBlbnRyeS5zZWxlY3RvciwgZW50cnkuZGJJRCApICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSWRzQXJyYXkucHVzaChlbnRyeS5kYklEKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZURhdGEucHVzaChlbnRyeSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBFdmVudExpc3RlbmVyKCBub2RlIClcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgLy91bmlxdWUgaWRzIG9ubHlcclxuICAgICAgICAgICAgICAgIHN0cmluZ0lkc0FycmF5ID0gWy4uLm5ldyBTZXQoc3RyaW5nSWRzQXJyYXkpXVxyXG4gICAgICAgICAgICAgICAgaWYgKCBzdHJpbmdJZHNBcnJheS5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKClcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCgnYWN0aW9uJyAgICAgICAsICd0cnBfZ2V0X3RyYW5zbGF0aW9uc18nICsgdHlwZVNsdWcpXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ2FsbF9sYW5ndWFnZXMnLCAndHJ1ZScpXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ3NlY3VyaXR5JyAgICAgLCB0aGlzLm5vbmNlc1snZ2V0dHJhbnNsYXRpb25zbm9uY2UnICsgdHlwZVNsdWddKVxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdsYW5ndWFnZScgICAgICwgbGFuZ3VhZ2VPZklkcylcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCgnc3RyaW5nX2lkcycgICAsIEpTT04uc3RyaW5naWZ5KHN0cmluZ0lkc0FycmF5KSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXhpb3MucG9zdCh0aGlzLmFqYXhfdXJsLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZGluZ19zdHJpbmdzLS1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkVG9EaWN0aW9uYXJ5KHJlc3BvbnNlLmRhdGEsIG5vZGVEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkaW5nX3N0cmluZ3MtLVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWxyZWFkeURldGVjdGVkKCBzZWxlY3RvciwgZGJJZCApe1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbWJpbmVkID0gc2VsZWN0b3IgKyAnPScgKyBkYklkXHJcbiAgICAgICAgICAgICAgICBpZiAoIHV0aWxzLmFycmF5Q29udGFpbnNJdGVtKCB0aGlzLmRldGVjdGVkU2VsZWN0b3JBbmRJZCwgY29tYmluZWQgKSApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRTZWxlY3RvckFuZElkLnB1c2goY29tYmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lciggbm9kZSApe1xyXG4gICAgICAgICAgICAgICAgaWYgKCBub2RlLnRhZ05hbWUgPT0gJ0EnICYmICFub2RlLmhhc0F0dHJpYnV0ZSggJ2RhdGEtdHJwZ2V0dGV4dG9yaWdpbmFsJyApIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgc2VsZi4kcmVmcy5ob3ZlckFjdGlvbnMuc2hvd1BlbmNpbEljb24gKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhZGRUb0RpY3Rpb25hcnkoIHJlc3BvbnNlRGF0YSwgbm9kZUluZm8gPSBudWxsICl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHJlc3BvbnNlRGF0YSAhPSBudWxsICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICggbm9kZUluZm8gKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uZm9yRWFjaChmdW5jdGlvbiAoIGluZm9Sb3csIGluZGV4ICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuc29tZSggZnVuY3Rpb24gKCByZXNwb25zZURhdGFSb3cgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mb1Jvdy5kYklEID09IHJlc3BvbnNlRGF0YVJvdy5kYklEICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JyaW5nIGJsb2NrX3R5cGUgdG8gdGhlIHRvcCBsZXZlbCBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXNwb25zZURhdGFSb3cudHlwZSAhPSAnZ2V0dGV4dCcgJiYgdHlwZW9mIHJlc3BvbnNlRGF0YVJvdy5ibG9ja190eXBlID09ICd1bmRlZmluZWQnICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0TGFuZ3VhZ2UgPSBzZWxmLm9yZGVyZWRTZWNvbmRhcnlMYW5ndWFnZXNbMF1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiByZXNwb25zZURhdGFSb3cudHJhbnNsYXRpb25zQXJyYXlbZmlyc3RMYW5ndWFnZV0uYmxvY2tfdHlwZSAhPSAndW5kZWZpbmVkJyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhUm93LmJsb2NrX3R5cGUgPSByZXNwb25zZURhdGFSb3cudHJhbnNsYXRpb25zQXJyYXlbZmlyc3RMYW5ndWFnZV0uYmxvY2tfdHlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5mb1tpbmRleF0gPSBPYmplY3QuYXNzaWduKCB7fSwgcmVzcG9uc2VEYXRhUm93LCBpbmZvUm93IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUgLy8gYSBzb3J0IG9mIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8gPSByZXNwb25zZURhdGFcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nR3JvdXBzID0gdGhpcy5hZGRUb1N0cmluZ0dyb3Vwcyggbm9kZUluZm8gKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeS5jb25jYXQoIG5vZGVJbmZvIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3RyaW5nc0Ryb3Bkb3duKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkVG9TdHJpbmdHcm91cHMoIHN0cmluZ3MgKXtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZWUgd2hhdCBub2RlIGdyb3VwcyBhcmUgZm91bmRcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZFN0cmluZ0dyb3VwcyA9IHRoaXMuc3RyaW5nR3JvdXBzO1xyXG4gICAgICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKCBmdW5jdGlvbiAoIHN0cmluZyApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIGZvdW5kU3RyaW5nR3JvdXBzLmluZGV4T2YoIHN0cmluZy5ncm91cCApID09PSAtMSAmJiAoICggdHlwZW9mIHN0cmluZy5ibG9ja1R5cGUgPT09ICd1bmRlZmluZWQnICkgfHwgc3RyaW5nLmJsb2NrVHlwZSAhPT0gJzInICkgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdHJpbmdHcm91cHMucHVzaCggc3RyaW5nLmdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgbm9kZSBncm91cHMgaW4gdGhlIG9yZGVyIHRoYXQgd2Ugd2FudCwgYWNjb3JkaW5nIHRvIHRoZSBwcm9wIHRoaXMuc3RyaW5nR3JvdXBPcmRlclxyXG4gICAgICAgICAgICAgICAgbGV0IG9yZGVyZWRTdHJpbmdHcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuZWRpdG9yU3RyaW5ncy5zZW9fdXBkYXRlX25vdGljZSAhPSAnc2VvX3BhY2tfdXBkYXRlX25vdF9uZWVkZWQnICl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJlZFN0cmluZ0dyb3Vwcy5wdXNoKCB0aGlzLmVkaXRvclN0cmluZ3Muc2VvX3VwZGF0ZV9ub3RpY2UgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZ0dyb3VwT3JkZXIuZm9yRWFjaCggZnVuY3Rpb24oIGdyb3VwICl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBmb3VuZFN0cmluZ0dyb3Vwcy5pbmRleE9mKCBncm91cCApICE9PSAtMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkU3RyaW5nR3JvdXBzLnB1c2goIGdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIHN0cmluZyBncm91cHMgdGhhdCB3ZXJlIG5vdCBpbiB0aGUgcHJvcCwgYWRkIHRoZW0gYXQgdGhlIGVuZC5cclxuICAgICAgICAgICAgICAgIGZvdW5kU3RyaW5nR3JvdXBzLmZvckVhY2goIGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICggb3JkZXJlZFN0cmluZ0dyb3Vwcy5pbmRleE9mKCBncm91cCApID09PSAtMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkU3RyaW5nR3JvdXBzLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRTdHJpbmdHcm91cHM7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldFN0cmluZ0luZGV4KCBzZWxlY3RvciwgZGJJRCApe1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5zb21lKGZ1bmN0aW9uICggc3RyaW5nLCBpbmRleCApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIHN0cmluZy5kYklEID09IGRiSUQgJiYgc3RyaW5nLnNlbGVjdG9yID09IHNlbGVjdG9yICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaW5kZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXROb2RlSW5mbyggbm9kZSwgYmFzZVNlbGVjdG9yID0gJycgKXtcclxuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdJZFxyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVEYXRhICA9IFtdXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0b3JzID0gdGhpcy5wcmVwYXJlU2VsZWN0b3JTdHJpbmdzKCBiYXNlU2VsZWN0b3IgKVxyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5mb3JFYWNoKCBmdW5jdGlvbiAoIHNlbGVjdG9yICkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdJZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCBzZWxlY3RvciApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggc3RyaW5nSWQgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZUF0dHJpYnV0ZSAgID0gc2VsZWN0b3IucmVwbGFjZSggYmFzZVNlbGVjdG9yLCAnJyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlR3JvdXAgICAgICAgPSBub2RlLmdldEF0dHJpYnV0ZSggJ2RhdGEtdHJwLW5vZGUtZ3JvdXAnICsgbm9kZUF0dHJpYnV0ZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlRGVzY3JpcHRpb24gPSBub2RlLmdldEF0dHJpYnV0ZSggJ2RhdGEtdHJwLW5vZGUtZGVzY3JpcHRpb24nICsgbm9kZUF0dHJpYnV0ZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYklEICAgICAgOiBzdHJpbmdJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yICA6IHNlbGVjdG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIDogbm9kZUF0dHJpYnV0ZS5zdWJzdHIoMSksIC8vIHN1YnN0cigxKSBpcyB1c2VkIHRvIHRyaW0gcHJlZml4aW5nIGxpbmUgLSBleC4gLWFsdCB3aWxsIHJlc3VsdCBpbiBhbHQgKG5vIGxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZUdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lmdyb3VwID0gbm9kZUdyb3VwXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5vZGVEZXNjcmlwdGlvbiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZXNjcmlwdGlvbiA9IG5vZGVEZXNjcmlwdGlvblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZURhdGEucHVzaCggZW50cnkgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlRGF0YVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXRBbGxTZWxlY3RvcnMoKXtcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvcnMgPSBbXVxyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgICAgICA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFBdHRyaWJ1dGVzLmZvckVhY2goIGZ1bmN0aW9uICggZGF0YUF0dHJpYnV0ZSApe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5jb25jYXQoIHNlbGYucHJlcGFyZVNlbGVjdG9yU3RyaW5ncyggZGF0YUF0dHJpYnV0ZSApIClcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcmVwYXJlU2VsZWN0b3JTdHJpbmdzKCBiYXNlTmFtZVNlbGVjdG9yICl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkX3NlbGVjdG9ycyA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RvcnMuZm9yRWFjaCggZnVuY3Rpb24gKCBzZWxlY3RvclN1ZmZpeCwgaW5kZXggKXtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRfc2VsZWN0b3JzLnB1c2goIGJhc2VOYW1lU2VsZWN0b3IgKyBzZWxlY3RvclN1ZmZpeCAgKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkX3NlbGVjdG9yc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwYXJlbnRVUkwoIHVybCApe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKCAndHJwLWVkaXQtdHJhbnNsYXRpb249cHJldmlldycsICd0cnAtZWRpdC10cmFuc2xhdGlvbj10cnVlJyApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNsZWFuVVJMKCB1cmwgKXtcclxuICAgICAgICAgICAgICAgIC8vbWFrZSByZW1vdmVVcmxQYXJhbWV0ZXIgcmVjdXJzaXZlIGFuZCBvbmx5IGNhbGwgaXQgb25jZSB3aXRoIGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0XHJcbiAgICAgICAgICAgICAgICAvL25lZWQgdG8gc3RyaXBwZWQgP1xyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMucmVtb3ZlVXJsUGFyYW1ldGVyKCB1cmwsICdsYW5nJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC12aWV3LWFzJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC12aWV3LWFzLW5vbmNlJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC1lZGl0LXRyYW5zbGF0aW9uJyApXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93U3RyaW5nKCBzdHJpbmcsIHR5cGUgKXtcclxuICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHN0cmluZy5ibG9ja1R5cGUgIT09ICd1bmRlZmluZWQnICYmIHN0cmluZy5ibG9ja1R5cGUgPT09ICcyJyApe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNob3cgZGVwcmVjYXRlZCB0cmFuc2xhdGlvbiBibG9ja3MgaW4gdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09IHRoaXMuZWRpdG9yU3RyaW5ncy5pbWFnZXMgJiYgdHlwZW9mIHN0cmluZy5hdHRyaWJ1dGUgIT0gJ3VuZGVmaW5lZCcgJiYgc3RyaW5nLmF0dHJpYnV0ZSA9PSAnc3JjJyApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHJpbmcuYXR0cmlidXRlICE9PSAndW5kZWZpbmVkJyAmJiAoIHN0cmluZy5hdHRyaWJ1dGUgPT0gJ2hyZWYnIHx8IHN0cmluZy5hdHRyaWJ1dGUgPT0gJ3NyYycgKSApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCBzdHJpbmcuZ3JvdXAgPT09IHR5cGUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGluaXRTdHJpbmdzRHJvcGRvd24oKXtcclxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICggIXRoaXMuaXNTdHJpbmdzRHJvcGRvd25PcGVuKCkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1zdHJpbmctY2F0ZWdvcmllcycgKS5zZWxlY3QyKCAnZGVzdHJveScgKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoIHsgcGxhY2Vob2xkZXIgOiBzZWxmLmVkaXRvclN0cmluZ3Muc2VsZWN0X3N0cmluZywgdGVtcGxhdGVSZXN1bHQ6IGZ1bmN0aW9uKG9wdGlvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbCAgICA9IGhlLmRlY29kZSggb3B0aW9uLnRleHQuc3Vic3RyaW5nKDAsIDkwKSApICsgKCAoIG9wdGlvbi50ZXh0Lmxlbmd0aCA8PSA5MCkgPyAnJyA6ICcuLi4nIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gKCBvcHRpb24udGl0bGUgKSA/ICAnKCcgKyBvcHRpb24udGl0bGUgKyAnKScgOiAnJ1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeSggJzxkaXY+JyArIG9yaWdpbmFsICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJzdHJpbmctc2VsZWN0b3ItZGVzY3JpcHRpb25cIj4nICsgZGVzY3JpcHRpb24gKyAnPC9kaXY+JyApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHdpZHRoIDogJzEwMCUnIH0gKS5wcm9wKCAnZGlzYWJsZWQnLCBmYWxzZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmhpZGUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdHJpbmdzRHJvcGRvd25Mb2FkaW5nKCl7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoIHsgcGxhY2Vob2xkZXIgOiB0aGlzLmVkaXRvclN0cmluZ3Muc3RyaW5nc19sb2FkaW5nLCB3aWR0aCA6ICcxMDAlJyB9ICkucHJvcCggJ2Rpc2FibGVkJywgdHJ1ZSApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByb2Nlc3NPcHRpb25OYW1lKCBuYW1lLCB0eXBlICl7XHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT0gJ0ltYWdlcycgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5nZXRGaWxlbmFtZSggbmFtZSApXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmVzY2FwZUh0bWwoIG5hbWUgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpc1N0cmluZ3NEcm9wZG93bk9wZW4oKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoICdpc09wZW4nIClcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaGFzVW5zYXZlZENoYW5nZXMoKXtcclxuICAgICAgICAgICAgICAgIGxldCB1bnNhdmVkQ2hhbmdlcyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGlmICggdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheS5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5mb3JFYWNoKGZ1bmN0aW9uIChsYW5ndWFnZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS50cmFuc2xhdGVkICE9PSBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS5lZGl0ZWRUcmFuc2xhdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlcyA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlID0gdW5zYXZlZENoYW5nZXNcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5zYXZlZENoYW5nZXNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWZyYW1lTG9hZGVyKCBzdGF0dXMgKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9hZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd0cnAtcHJldmlldy1sb2FkZXInIClcclxuXHJcbiAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09ICdzaG93JyApXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHN0YXR1cyA9PSAnaGlkZScgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByZXZpb3VzU3RyaW5nKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RycC1zdHJpbmctY2F0ZWdvcmllcycpLnZhbHVlXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlID0gK2N1cnJlbnRWYWx1ZSAtIDFcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSggbmV3VmFsdWUgPj0gMCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHJwLXN0cmluZy1jYXRlZ29yaWVzIG9wdGlvblt2YWx1ZT1cIicgKyBuZXdWYWx1ZSArICdcIl0nKS5sZW5ndGggPT09IDAgKXtcclxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZS0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCBuZXdWYWx1ZSA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdHJpbmcgPSBuZXdWYWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5leHRTdHJpbmcoKXtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJwLXN0cmluZy1jYXRlZ29yaWVzJykudmFsdWUsIG5ld1ZhbHVlID0gMFxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCBjdXJyZW50VmFsdWUgIT0gJycgKVxyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gK2N1cnJlbnRWYWx1ZSArIDFcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSggbmV3VmFsdWUgPCB0aGlzLmRpY3Rpb25hcnkubGVuZ3RoICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0cnAtc3RyaW5nLWNhdGVnb3JpZXMgb3B0aW9uW3ZhbHVlPVwiJyArIG5ld1ZhbHVlICsgJ1wiXScpLmxlbmd0aCA9PT0gMCApe1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCBuZXdWYWx1ZSA+PSB0aGlzLmRpY3Rpb25hcnkubGVuZ3RoICl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0cmluZyA9IG5ld1ZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkS2V5Ym9hcmRTaG9ydGN1dHNMaXN0ZW5lcigpe1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaChcIk1hY1wiKSA/IGUubWV0YUtleSA6IGUuY3RybEtleSkgJiYgZS5hbHRLZXkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENUUkwgKyBBTFQgKyByaWdodCBhcnJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggZS5rZXlDb2RlID09PSAzOSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ3RycF90cmlnZ2VyX25leHRfc3RyaW5nX2V2ZW50JyApICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIGxlZnQgYXJyb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlLmtleUNvZGUgPT09IDM3ICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAndHJwX3RyaWdnZXJfcHJldmlvdXNfc3RyaW5nX2V2ZW50JyApICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0cnBfdHJpZ2dlcl9uZXh0X3N0cmluZ19ldmVudCcsIHRoaXMubmV4dFN0cmluZyApXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RycF90cmlnZ2VyX3ByZXZpb3VzX3N0cmluZ19ldmVudCcsIHRoaXMucHJldmlvdXNTdHJpbmcgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZXNpemVJZnJhbWUgKGV2ZW50LCB1aSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsX3dpZHRoID0galF1ZXJ5KHdpbmRvdykud2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGpRdWVyeSggJyN0cnAtY29udHJvbHMnICkud2lkdGgoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZih3aWR0aCA+IHRvdGFsX3dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB0b3RhbF93aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9scy5jc3MoJ3dpZHRoJywgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZpZXdDb250YWluZXIgPSBqUXVlcnkoICcjdHJwLXByZXZpZXcnICk7XHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3Q29udGFpbmVyLmNzcygncmlnaHQnLCB3aWR0aCApO1xyXG4gICAgICAgICAgICAgICAgcHJldmlld0NvbnRhaW5lci5jc3MoJ2xlZnQnLCAoIHdpZHRoIC0gMzQ4ICkgKTtcclxuICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIuY3NzKCd3aWR0aCcsICh0b3RhbF93aWR0aCAtIHdpZHRoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vYWRkIHN1cHBvcnQgZm9yIHYtbW9kZWwgaW4gc2VsZWN0MlxyXG4gICAgICAgIGRpcmVjdGl2ZXM6IHtcclxuICAgICAgICAgICAgc2VsZWN0Mjoge1xyXG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZWwpLm9uKCdzZWxlY3QyOnNlbGVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeShlbCkub24oJ3NlbGVjdDI6dW5zZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChldmVudClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuPC9zY3JpcHQ+XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/editor.vue?vue&type=script&lang=js&\n");
719
 
720
  /***/ }),
721
 
@@ -817,7 +817,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
817
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
818
 
819
  "use strict";
820
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _vm.selectedIndexesArray\n ? _c(\n \"div\",\n {\n staticClass: \"trp-controls-section-content\",\n attrs: { id: \"trp-translation-section\" }\n },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.showChangesUnsavedMessage,\n expression: \"showChangesUnsavedMessage\"\n }\n ],\n staticClass: \"trp-changes-unsaved-message\"\n },\n [\n _vm._v(_vm._s(_vm.editorStrings.unsaved_changes) + \" \"),\n _c(\n \"span\",\n {\n staticClass: \"trp-unsaved-changes trp-discard-changes \",\n attrs: { title: _vm.editorStrings.discard_all_title_attr },\n on: { click: _vm.discardAll }\n },\n [_vm._v(_vm._s(_vm.editorStrings.discard_all))]\n ),\n _vm._v(\"?\")\n ]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.languages, function(languageCode, key) {\n return _c(\n \"div\",\n { attrs: { id: \"trp-language-\" + languageCode } },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n (key <= _vm.othersButtonPosition ||\n _vm.showOtherLanguages) &&\n (_vm.selectedIndexesArray &&\n _vm.selectedIndexesArray.length > 0),\n expression:\n \"( (key <= othersButtonPosition) || showOtherLanguages ) && ( selectedIndexesArray && selectedIndexesArray.length > 0 )\"\n }\n ],\n staticClass: \"trp-language-container\"\n },\n [\n _c(\"div\", { staticClass: \"trp-language-name\" }, [\n key == 0\n ? _c(\"span\", [\n _vm._v(_vm._s(_vm.editorStrings.from) + \" \")\n ])\n : _c(\"span\", [\n _vm._v(_vm._s(_vm.editorStrings.to) + \" \")\n ]),\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.completeLanguageNames[languageCode]) +\n \"\\n \"\n ),\n languageCode != \"original\"\n ? _c(\"img\", {\n staticClass: \"trp-language-box-flag-image\",\n attrs: {\n src: _vm.flagsPath + \"/\" + languageCode + \".png\",\n width: \"18\",\n height: \"12\",\n alt: languageCode,\n title: _vm.completeLanguageNames[languageCode]\n }\n })\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\n \"table\",\n { staticClass: \"trp-translations-for-language\" },\n [\n _vm.showImageIcon\n ? _c(\n \"td\",\n { staticClass: \"trp-translation-icon-container\" },\n [\n _c(\"span\", {\n staticClass:\n \"trp-translation-icon dashicons dashicons-format-image\"\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"td\",\n { staticClass: \"trp-translations-container\" },\n _vm._l(_vm.selectedIndexesArray, function(\n selectedIndex\n ) {\n return _c(\n \"div\",\n { staticClass: \"trp-string-container\" },\n [\n _vm.dictionary[selectedIndex] &&\n _vm.dictionary[selectedIndex].translationsArray[\n languageCode\n ]\n ? _c(\n \"div\",\n { key: selectedIndex },\n [\n _c(\"translation-input\", {\n attrs: {\n string:\n _vm.dictionary[selectedIndex],\n highlightUnsavedChanges:\n _vm.showChangesUnsavedMessage &&\n _vm.hasUnsavedChanges(\n selectedIndex,\n languageCode\n ),\n editorStrings: _vm.editorStrings\n },\n model: {\n value:\n _vm.dictionary[selectedIndex]\n .translationsArray[languageCode]\n .editedTranslation,\n callback: function($$v) {\n _vm.$set(\n _vm.dictionary[selectedIndex]\n .translationsArray[\n languageCode\n ],\n \"editedTranslation\",\n $$v\n )\n },\n expression:\n \"dictionary[selectedIndex].translationsArray[languageCode].editedTranslation\"\n }\n })\n ],\n 1\n )\n : _vm.dictionary[selectedIndex]\n ? _c(\n \"div\",\n { key: selectedIndex },\n [\n _c(\"translation-input\", {\n attrs: {\n readonly: true,\n string:\n _vm.dictionary[selectedIndex],\n value:\n _vm.dictionary[selectedIndex]\n .original,\n editorStrings: _vm.editorStrings\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"trp-translation-input-footer\",\n attrs: {\n \"data-dictionary-entry\": JSON.stringify(\n _vm.dictionary[selectedIndex]\n )\n }\n },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n _vm.dictionary[selectedIndex]\n .attribute != \"content\" ||\n _vm.dictionary[selectedIndex]\n .attribute != \"\",\n expression:\n \"dictionary[selectedIndex].attribute != 'content' || dictionary[selectedIndex].attribute != ''\"\n }\n ],\n staticClass: \"trp-attribute-name\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.editorStrings[\n _vm.dictionary[selectedIndex]\n .attribute\n ]\n ? _vm.editorStrings[\n _vm.dictionary[selectedIndex]\n .attribute\n ]\n : _vm.editorStrings.text\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _vm.dictionary[selectedIndex] &&\n _vm.dictionary[selectedIndex]\n .translationsArray[languageCode]\n ? _c(\n \"div\",\n {\n staticClass:\n \"trp-discard-changes trp-discard-individual-changes\",\n class: {\n \"trp-unsaved-changes\": _vm.hasUnsavedChanges(\n selectedIndex,\n languageCode\n )\n },\n attrs: {\n title:\n _vm.editorStrings\n .discard_individual_changes_title_attribute\n },\n on: {\n click: function($event) {\n _vm.discardChanges(\n selectedIndex,\n languageCode\n )\n }\n }\n },\n [\n _vm._v(\n _vm._s(_vm.editorStrings.discard)\n )\n ]\n )\n : _vm._e()\n ]\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: key == _vm.othersButtonPosition,\n expression: \"key == othersButtonPosition\"\n }\n ]\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"trp-toggle-languages\",\n class: {\n \"trp-show-other-languages\":\n _vm.showOtherLanguages,\n \"trp-hide-other-languages\": !_vm.showOtherLanguages\n },\n on: {\n click: function($event) {\n _vm.showOtherLanguages = !_vm.showOtherLanguages\n }\n }\n },\n [\n _c(\"span\", [\n _vm._v(\n _vm._s(_vm.showOtherLanguages ? \"⯆\" : \"⯈\") +\n \" \" +\n _vm._s(_vm.editorStrings.other_lang)\n )\n ])\n ]\n )\n ]\n )\n ]\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm._e()\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2pzL2NvbXBvbmVudHMvbGFuZ3VhZ2UtYm94ZXMudnVlP2IxNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsa0RBQWtEO0FBQzVFLHVCQUF1QjtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTLHFDQUFxQyxFQUFFO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLCtCQUErQixtQ0FBbUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwrQ0FBK0M7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0RBQWdEO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw0Q0FBNEM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixzQ0FBc0M7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMscUJBQXFCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMscUJBQXFCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9hc3NldHMvc3JjL2pzL2NvbXBvbmVudHMvbGFuZ3VhZ2UtYm94ZXMudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNmODBjZjEwJi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX3ZtLnNlbGVjdGVkSW5kZXhlc0FycmF5XG4gICAgPyBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1jb250cm9scy1zZWN0aW9uLWNvbnRlbnRcIixcbiAgICAgICAgICBhdHRyczogeyBpZDogXCJ0cnAtdHJhbnNsYXRpb24tc2VjdGlvblwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtY2hhbmdlcy11bnNhdmVkLW1lc3NhZ2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy51bnNhdmVkX2NoYW5nZXMpICsgXCIgXCIpLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtdW5zYXZlZC1jaGFuZ2VzIHRycC1kaXNjYXJkLWNoYW5nZXMgXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczogeyB0aXRsZTogX3ZtLmVkaXRvclN0cmluZ3MuZGlzY2FyZF9hbGxfdGl0bGVfYXR0ciB9LFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5kaXNjYXJkQWxsIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS5lZGl0b3JTdHJpbmdzLmRpc2NhcmRfYWxsKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF92bS5fdihcIj9cIilcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgX3ZtLl9sKF92bS5sYW5ndWFnZXMsIGZ1bmN0aW9uKGxhbmd1YWdlQ29kZSwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsgYXR0cnM6IHsgaWQ6IFwidHJwLWxhbmd1YWdlLVwiICsgbGFuZ3VhZ2VDb2RlIH0gfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5IDw9IF92bS5vdGhlcnNCdXR0b25Qb3NpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93T3RoZXJMYW5ndWFnZXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChfdm0uc2VsZWN0ZWRJbmRleGVzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc2VsZWN0ZWRJbmRleGVzQXJyYXkubGVuZ3RoID4gMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIiggKGtleSA8PSBvdGhlcnNCdXR0b25Qb3NpdGlvbikgfHwgc2hvd090aGVyTGFuZ3VhZ2VzICkgJiYgKCBzZWxlY3RlZEluZGV4ZXNBcnJheSAmJiBzZWxlY3RlZEluZGV4ZXNBcnJheS5sZW5ndGggPiAwIClcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWxhbmd1YWdlLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInRycC1sYW5ndWFnZS1uYW1lXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgIGtleSA9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy5mcm9tKSArIFwiIFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfYyhcInNwYW5cIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3MudG8pICsgXCIgXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5jb21wbGV0ZUxhbmd1YWdlTmFtZXNbbGFuZ3VhZ2VDb2RlXSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDb2RlICE9IFwib3JpZ2luYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWxhbmd1YWdlLWJveC1mbGFnLWltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogX3ZtLmZsYWdzUGF0aCArIFwiL1wiICsgbGFuZ3VhZ2VDb2RlICsgXCIucG5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxOFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IGxhbmd1YWdlQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdm0uY29tcGxldGVMYW5ndWFnZU5hbWVzW2xhbmd1YWdlQ29kZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcInRhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ0cnAtdHJhbnNsYXRpb25zLWZvci1sYW5ndWFnZVwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dJbWFnZUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwidHJwLXRyYW5zbGF0aW9uLWljb24tY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJwLXRyYW5zbGF0aW9uLWljb24gZGFzaGljb25zIGRhc2hpY29ucy1mb3JtYXQtaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcInRycC10cmFuc2xhdGlvbnMtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5zZWxlY3RlZEluZGV4ZXNBcnJheSwgZnVuY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ0cnAtc3RyaW5nLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBrZXk6IHNlbGVjdGVkSW5kZXggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwidHJhbnNsYXRpb24taW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRVbnNhdmVkQ2hhbmdlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYXNVbnNhdmVkQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzOiBfdm0uZWRpdG9yU3RyaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVkaXRlZFRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLiRzZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25zQXJyYXlbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWRpdGVkVHJhbnNsYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS5lZGl0ZWRUcmFuc2xhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGtleTogc2VsZWN0ZWRJbmRleCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJ0cmFuc2xhdGlvbi1pbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yaWdpbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzOiBfdm0uZWRpdG9yU3RyaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC10cmFuc2xhdGlvbi1pbnB1dC1mb290ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS1kaWN0aW9uYXJ5LWVudHJ5XCI6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUgIT0gXCJjb250ZW50XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZSAhPSBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgIT0gJ2NvbnRlbnQnIHx8IGRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0uYXR0cmlidXRlICE9ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1hdHRyaWJ1dGUtbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5lZGl0b3JTdHJpbmdzW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF92bS5lZGl0b3JTdHJpbmdzW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5lZGl0b3JTdHJpbmdzLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRycC1kaXNjYXJkLWNoYW5nZXMgdHJwLWRpc2NhcmQtaW5kaXZpZHVhbC1jaGFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cnAtdW5zYXZlZC1jaGFuZ2VzXCI6IF92bS5oYXNVbnNhdmVkQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZWRpdG9yU3RyaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzY2FyZF9pbmRpdmlkdWFsX2NoYW5nZXNfdGl0bGVfYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpc2NhcmRDaGFuZ2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3MuZGlzY2FyZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToga2V5ID09IF92bS5vdGhlcnNCdXR0b25Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImtleSA9PSBvdGhlcnNCdXR0b25Qb3NpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLXRvZ2dsZS1sYW5ndWFnZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cnAtc2hvdy1vdGhlci1sYW5ndWFnZXNcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dPdGhlckxhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJwLWhpZGUtb3RoZXItbGFuZ3VhZ2VzXCI6ICFfdm0uc2hvd090aGVyTGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc2hvd090aGVyTGFuZ3VhZ2VzID0gIV92bS5zaG93T3RoZXJMYW5ndWFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInNwYW5cIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnNob3dPdGhlckxhbmd1YWdlcyA/IFwi4q+GXCIgOiBcIuKviFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy5vdGhlcl9sYW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICBdLFxuICAgICAgICAyXG4gICAgICApXG4gICAgOiBfdm0uX2UoKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/components/language-boxes.vue?vue&type=template&id=3f80cf10&\n");
821
 
822
  /***/ }),
823
 
@@ -853,7 +853,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
853
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
854
 
855
  "use strict";
856
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"trp-editor\" } }, [\n _c(\n \"div\",\n { attrs: { id: \"trp-controls\" } },\n [\n _c(\n \"div\",\n { staticClass: \"trp-controls-container\" },\n [\n _c(\"div\", { attrs: { id: \"trp-close-save\" } }, [\n _c(\"a\", {\n attrs: {\n id: \"trp-controls-close\",\n href: _vm.closeURL,\n title: _vm.editorStrings.close\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n { attrs: { id: \"trp-save-and-loader-spinner\" } },\n [\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.loading_strings > 0,\n expression: \"loading_strings > 0\"\n }\n ],\n staticClass: \"trp-ajax-loader\",\n attrs: { id: \"trp-string-saved-ajax-loader\" }\n },\n [_c(\"div\", { staticClass: \"trp-spinner\" })]\n ),\n _vm._v(\" \"),\n _c(\"save-translations\", {\n attrs: {\n selectedIndexesArray: _vm.selectedIndexesArray,\n dictionary: _vm.dictionary,\n settings: _vm.settings,\n nonces: _vm.nonces,\n ajax_url: _vm.ajax_url,\n currentLanguage: _vm.currentLanguage,\n onScreenLanguage: _vm.onScreenLanguage,\n iframe: _vm.iframe,\n currentURL: _vm.currentURL,\n mergingString: _vm.mergingString,\n mergeData: _vm.mergeData,\n editorStrings: _vm.editorStrings\n },\n on: {\n \"translations-saved\": function($event) {\n _vm.showChangesUnsavedMessage = false\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"trp-controls-section\" }, [\n _c(\"div\", { staticClass: \"trp-controls-section-content\" }, [\n _c(\"div\", { attrs: { id: \"trp-language-switch\" } }, [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.currentLanguage,\n expression: \"currentLanguage\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-language-select\", name: \"lang\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.currentLanguage = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.languageNames, function(lang, langIndex) {\n return _c(\"option\", { domProps: { value: langIndex } }, [\n _vm._v(_vm._s(lang))\n ])\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-string-list\" } }, [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedString,\n expression: \"selectedString\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-string-categories\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedString = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.stringGroups, function(group) {\n return _c(\n \"optgroup\",\n { attrs: { label: group } },\n _vm._l(_vm.dictionary, function(string, index) {\n return _vm.showString(string, group)\n ? _c(\n \"option\",\n {\n attrs: {\n title: string.description,\n \"data-database-id\": string.dbID,\n \"data-group\": string.group\n },\n domProps: { value: index }\n },\n [\n _vm._v(\n _vm._s(\n _vm.processOptionName(\n string.original,\n group\n )\n )\n )\n ]\n )\n : _vm._e()\n }),\n 0\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-next-previous\" } }, [\n _c(\n \"button\",\n {\n staticClass: \"trp-next-previous-buttons\",\n attrs: {\n type: \"button\",\n id: \"trp-previous\",\n title: _vm.editorStrings.previous_title_attr\n },\n on: {\n click: function($event) {\n _vm.previousString()\n }\n }\n },\n [\n _c(\"span\", [_vm._v(\"«\")]),\n _vm._v(\" \" + _vm._s(_vm.editorStrings.previous))\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"trp-next-previous-buttons\",\n attrs: {\n type: \"button\",\n id: \"trp-next\",\n title: _vm.editorStrings.next_title_attr\n },\n on: {\n click: function($event) {\n _vm.nextString()\n }\n }\n },\n [\n _vm._v(_vm._s(_vm.editorStrings.next) + \" \"),\n _c(\"span\", [_vm._v(\"»\")])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-view-as\" } }, [\n _c(\"div\", { attrs: { id: \"trp-view-as-description\" } }, [\n _vm._v(_vm._s(_vm.editorStrings.view_as))\n ]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.viewAs,\n expression: \"viewAs\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-view-as-select\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.viewAs = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.roles, function(role, roleIndex) {\n return _c(\n \"option\",\n {\n attrs: {\n disabled: !role,\n title: !role ? _vm.editorStrings.view_as_pro : \"\"\n },\n domProps: { value: role }\n },\n [_vm._v(_vm._s(roleIndex))]\n )\n }),\n 0\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.selectedString !== null,\n expression: \"selectedString !== null\"\n }\n ],\n staticClass: \"trp-controls-section\"\n },\n [\n _c(\"language-boxes\", {\n attrs: {\n selectedIndexesArray: _vm.selectedIndexesArray,\n dictionary: _vm.dictionary,\n currentLanguage: _vm.currentLanguage,\n onScreenLanguage: _vm.onScreenLanguage,\n languageNames: _vm.languageNames,\n settings: _vm.settings,\n showChangesUnsavedMessage: _vm.showChangesUnsavedMessage,\n editorStrings: _vm.editorStrings,\n flagsPath: _vm.flags_path,\n iframe: _vm.iframe\n },\n on: {\n \"discarded-changes\": function($event) {\n _vm.hasUnsavedChanges()\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"extra-content\", {\n attrs: {\n languageNames: _vm.languageNames,\n editorStrings: _vm.editorStrings,\n paidVersion: _vm.paid_version\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.translationNotLoadedYet,\n expression: \"translationNotLoadedYet\"\n }\n ],\n staticClass: \"trp-controls-section\"\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"trp-controls-section-content\",\n attrs: { id: \"trp-translation-not-ready-section\" }\n },\n [\n _c(\"p\", {\n domProps: {\n innerHTML: _vm._s(\n _vm.editorStrings.translation_not_loaded_yet\n )\n }\n })\n ]\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp_select2_overlay\" } }),\n _vm._v(\" \"),\n _c(\"hover-actions\", {\n ref: \"hoverActions\",\n attrs: {\n dictionary: _vm.dictionary,\n settings: _vm.settings,\n iframe: _vm.iframe,\n dataAttributes: _vm.dataAttributes,\n mergeRules: _vm.mergeRules,\n nonces: _vm.nonces,\n ajax_url: _vm.ajax_url,\n mergeData: _vm.mergeData,\n editorStrings: _vm.editorStrings\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-preview\" } }, [\n _c(\"iframe\", {\n attrs: { id: \"trp-preview-iframe\", src: _vm.urlToLoad },\n on: { load: _vm.iFrameLoaded }\n }),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-preview-loader\" } }, [\n _c(\n \"svg\",\n {\n staticClass: \"trp-loader\",\n attrs: {\n width: \"65px\",\n height: \"65px\",\n viewBox: \"0 0 66 66\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }\n },\n [\n _c(\"circle\", {\n staticClass: \"trp-circle\",\n attrs: {\n fill: \"none\",\n \"stroke-width\": \"6\",\n \"stroke-linecap\": \"round\",\n cx: \"33\",\n cy: \"33\",\n r: \"30\"\n }\n })\n ]\n )\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2pzL2VkaXRvci52dWU/NTEwNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTLG1CQUFtQixFQUFFO0FBQ2xEO0FBQ0E7QUFDQSxPQUFPLFNBQVMscUJBQXFCLEVBQUU7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3Q0FBd0M7QUFDbkQ7QUFDQSx1QkFBdUIsU0FBUyx1QkFBdUIsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVMsb0NBQW9DLEVBQUU7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIscUJBQXFCO0FBQ3JCLGdDQUFnQyw2QkFBNkI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNDQUFzQztBQUM3RCx5QkFBeUIsOENBQThDO0FBQ3ZFLDJCQUEyQixTQUFTLDRCQUE0QixFQUFFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQSw4QkFBOEIsMENBQTBDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSwyQ0FBMkMsWUFBWSxtQkFBbUIsRUFBRTtBQUM1RTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsd0JBQXdCLEVBQUU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBLDhCQUE4Qiw4QkFBOEI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUyxlQUFlLEVBQUU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLDZDQUE2QztBQUM3QyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUywwQkFBMEIsRUFBRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsb0JBQW9CLEVBQUU7QUFDMUQsNkJBQTZCLFNBQVMsZ0NBQWdDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBLDhCQUE4QiwyQkFBMkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQixxQ0FBcUM7QUFDckMseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTLDRCQUE0QixFQUFFO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVMsb0JBQW9CLEVBQUU7QUFDOUM7QUFDQSxnQkFBZ0IsK0NBQStDO0FBQy9ELGFBQWE7QUFDYixPQUFPO0FBQ1A7QUFDQSxpQkFBaUIsU0FBUywyQkFBMkIsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vYXNzZXRzL3NyYy9qcy9lZGl0b3IudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWIwNDZlOGVjJi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtZWRpdG9yXCIgfSB9LCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBhdHRyczogeyBpZDogXCJ0cnAtY29udHJvbHNcIiB9IH0sXG4gICAgICBbXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ0cnAtY29udHJvbHMtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1jbG9zZS1zYXZlXCIgfSB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiYVwiLCB7XG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBcInRycC1jb250cm9scy1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgaHJlZjogX3ZtLmNsb3NlVVJMLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLmNsb3NlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7IGF0dHJzOiB7IGlkOiBcInRycC1zYXZlLWFuZC1sb2FkZXItc3Bpbm5lclwiIH0gfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmxvYWRpbmdfc3RyaW5ncyA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwibG9hZGluZ19zdHJpbmdzID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtYWpheC1sb2FkZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJ0cnAtc3RyaW5nLXNhdmVkLWFqYXgtbG9hZGVyXCIgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0cnAtc3Bpbm5lclwiIH0pXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICBfYyhcInNhdmUtdHJhbnNsYXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheTogX3ZtLnNlbGVjdGVkSW5kZXhlc0FycmF5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnk6IF92bS5kaWN0aW9uYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBfdm0uc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgbm9uY2VzOiBfdm0ubm9uY2VzLFxuICAgICAgICAgICAgICAgICAgICAgIGFqYXhfdXJsOiBfdm0uYWpheF91cmwsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlOiBfdm0uY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgIG9uU2NyZWVuTGFuZ3VhZ2U6IF92bS5vblNjcmVlbkxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogX3ZtLmlmcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VVJMOiBfdm0uY3VycmVudFVSTCxcbiAgICAgICAgICAgICAgICAgICAgICBtZXJnaW5nU3RyaW5nOiBfdm0ubWVyZ2luZ1N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBtZXJnZURhdGE6IF92bS5tZXJnZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBcInRyYW5zbGF0aW9ucy1zYXZlZFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb24tY29udGVudFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1sYW5ndWFnZS1zd2l0Y2hcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmN1cnJlbnRMYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJjdXJyZW50TGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJzZWxlY3QyXCIsIHJhd05hbWU6IFwidi1zZWxlY3QyXCIgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwidHJwLWxhbmd1YWdlLXNlbGVjdFwiLCBuYW1lOiBcImxhbmdcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsIGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uY3VycmVudExhbmd1YWdlID0gJGV2ZW50LnRhcmdldC5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJCRzZWxlY3RlZFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJCRzZWxlY3RlZFZhbFswXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5sYW5ndWFnZU5hbWVzLCBmdW5jdGlvbihsYW5nLCBsYW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXCJvcHRpb25cIiwgeyBkb21Qcm9wczogeyB2YWx1ZTogbGFuZ0luZGV4IH0gfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhsYW5nKSlcbiAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtc3RyaW5nLWxpc3RcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnNlbGVjdGVkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInNlbGVjdGVkU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IFwic2VsZWN0MlwiLCByYXdOYW1lOiBcInYtc2VsZWN0MlwiIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGlkOiBcInRycC1zdHJpbmctY2F0ZWdvcmllc1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkJHNlbGVjdGVkVmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3RlZFN0cmluZyA9ICRldmVudC50YXJnZXQubXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICQkc2VsZWN0ZWRWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICQkc2VsZWN0ZWRWYWxbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uc3RyaW5nR3JvdXBzLCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgbGFiZWw6IGdyb3VwIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uZGljdGlvbmFyeSwgZnVuY3Rpb24oc3RyaW5nLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnNob3dTdHJpbmcoc3RyaW5nLCBncm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJpbmcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtZGF0YWJhc2UtaWRcIjogc3RyaW5nLmRiSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtZ3JvdXBcIjogc3RyaW5nLmdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogaW5kZXggfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucHJvY2Vzc09wdGlvbk5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLm9yaWdpbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1uZXh0LXByZXZpb3VzXCIgfSB9LCBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1uZXh0LXByZXZpb3VzLWJ1dHRvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcInRycC1wcmV2aW91c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLnByZXZpb3VzX3RpdGxlX2F0dHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5wcmV2aW91c1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLCq1wiKV0pLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiArIF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy5wcmV2aW91cykpXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtbmV4dC1wcmV2aW91cy1idXR0b25zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJ0cnAtbmV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLm5leHRfdGl0bGVfYXR0clxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLm5leHRTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3MubmV4dCkgKyBcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLCu1wiKV0pXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXNcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXMtZGVzY3JpcHRpb25cIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy52aWV3X2FzKSlcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpZXdBcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aWV3QXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJzZWxlY3QyXCIsIHJhd05hbWU6IFwidi1zZWxlY3QyXCIgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXMtc2VsZWN0XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICQkc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLCBmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gXCJfdmFsdWVcIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnZpZXdBcyA9ICRldmVudC50YXJnZXQubXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICQkc2VsZWN0ZWRWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICQkc2VsZWN0ZWRWYWxbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0ucm9sZXMsIGZ1bmN0aW9uKHJvbGUsIHJvbGVJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFyb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAhcm9sZSA/IF92bS5lZGl0b3JTdHJpbmdzLnZpZXdfYXNfcHJvIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogcm9sZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3Mocm9sZUluZGV4KSldXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2VsZWN0ZWRTdHJpbmcgIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2VsZWN0ZWRTdHJpbmcgIT09IG51bGxcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXCJsYW5ndWFnZS1ib3hlc1wiLCB7XG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheTogX3ZtLnNlbGVjdGVkSW5kZXhlc0FycmF5LFxuICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5OiBfdm0uZGljdGlvbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlOiBfdm0uY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICBvblNjcmVlbkxhbmd1YWdlOiBfdm0ub25TY3JlZW5MYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VOYW1lczogX3ZtLmxhbmd1YWdlTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBfdm0uc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2U6IF92bS5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzOiBfdm0uZWRpdG9yU3RyaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3NQYXRoOiBfdm0uZmxhZ3NfcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiBfdm0uaWZyYW1lXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgXCJkaXNjYXJkZWQtY2hhbmdlc1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFzVW5zYXZlZENoYW5nZXMoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICBfYyhcImV4dHJhLWNvbnRlbnRcIiwge1xuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlTmFtZXM6IF92bS5sYW5ndWFnZU5hbWVzLFxuICAgICAgICAgICAgICAgIGVkaXRvclN0cmluZ3M6IF92bS5lZGl0b3JTdHJpbmdzLFxuICAgICAgICAgICAgICAgIHBhaWRWZXJzaW9uOiBfdm0ucGFpZF92ZXJzaW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS50cmFuc2xhdGlvbk5vdExvYWRlZFlldCxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ0cmFuc2xhdGlvbk5vdExvYWRlZFlldFwiXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtY29udHJvbHMtc2VjdGlvblwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1jb250cm9scy1zZWN0aW9uLWNvbnRlbnRcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwidHJwLXRyYW5zbGF0aW9uLW5vdC1yZWFkeS1zZWN0aW9uXCIgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJwXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5lZGl0b3JTdHJpbmdzLnRyYW5zbGF0aW9uX25vdF9sb2FkZWRfeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgMVxuICAgICAgICApLFxuICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycF9zZWxlY3QyX292ZXJsYXlcIiB9IH0pLFxuICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICBfYyhcImhvdmVyLWFjdGlvbnNcIiwge1xuICAgICAgICAgIHJlZjogXCJob3ZlckFjdGlvbnNcIixcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgZGljdGlvbmFyeTogX3ZtLmRpY3Rpb25hcnksXG4gICAgICAgICAgICBzZXR0aW5nczogX3ZtLnNldHRpbmdzLFxuICAgICAgICAgICAgaWZyYW1lOiBfdm0uaWZyYW1lLFxuICAgICAgICAgICAgZGF0YUF0dHJpYnV0ZXM6IF92bS5kYXRhQXR0cmlidXRlcyxcbiAgICAgICAgICAgIG1lcmdlUnVsZXM6IF92bS5tZXJnZVJ1bGVzLFxuICAgICAgICAgICAgbm9uY2VzOiBfdm0ubm9uY2VzLFxuICAgICAgICAgICAgYWpheF91cmw6IF92bS5hamF4X3VybCxcbiAgICAgICAgICAgIG1lcmdlRGF0YTogX3ZtLm1lcmdlRGF0YSxcbiAgICAgICAgICAgIGVkaXRvclN0cmluZ3M6IF92bS5lZGl0b3JTdHJpbmdzXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIDFcbiAgICApLFxuICAgIF92bS5fdihcIiBcIiksXG4gICAgX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtcHJldmlld1wiIH0gfSwgW1xuICAgICAgX2MoXCJpZnJhbWVcIiwge1xuICAgICAgICBhdHRyczogeyBpZDogXCJ0cnAtcHJldmlldy1pZnJhbWVcIiwgc3JjOiBfdm0udXJsVG9Mb2FkIH0sXG4gICAgICAgIG9uOiB7IGxvYWQ6IF92bS5pRnJhbWVMb2FkZWQgfVxuICAgICAgfSksXG4gICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtcHJldmlldy1sb2FkZXJcIiB9IH0sIFtcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJzdmdcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtbG9hZGVyXCIsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICB3aWR0aDogXCI2NXB4XCIsXG4gICAgICAgICAgICAgIGhlaWdodDogXCI2NXB4XCIsXG4gICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDY2IDY2XCIsXG4gICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFwiY2lyY2xlXCIsIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWNpcmNsZVwiLFxuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIGZpbGw6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIFwic3Ryb2tlLXdpZHRoXCI6IFwiNlwiLFxuICAgICAgICAgICAgICAgIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICAgICAgICAgICAgICAgIGN4OiBcIjMzXCIsXG4gICAgICAgICAgICAgICAgY3k6IFwiMzNcIixcbiAgICAgICAgICAgICAgICByOiBcIjMwXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIClcbiAgICAgIF0pXG4gICAgXSlcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/editor.vue?vue&type=template&id=b046e8ec&\n");
857
 
858
  /***/ }),
859
 
679
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
680
 
681
  "use strict";
682
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _translation_input_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./translation-input.vue */ \"./assets/src/js/components/translation-input.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['selectedIndexesArray', 'dictionary', 'currentLanguage', 'onScreenLanguage', 'languageNames', 'settings', 'showChangesUnsavedMessage', 'editorStrings', 'flagsPath', 'iframe'],\n data: function data() {\n return {\n languages: [],\n completeLanguageNames: Object.assign({\n 'original': 'Original String'\n }, this.languageNames),\n othersButtonPositionOffset: 1,\n showOtherLanguages: false,\n orderedLanguages: [],\n showImageIcon: true\n };\n },\n components: {\n translationInput: _translation_input_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n mounted: function mounted() {\n this.determineLanguageOrder();\n this.addKeyboardShortcutsListener();\n },\n updated: function updated() {\n // if already active do nothing\n if (document.activeElement.classList.contains('trp-translation-input')) {\n return;\n } // place the cursor in the first textarea or input for translation\n\n\n var translationSection = document.getElementById('trp-translation-section');\n\n if (translationSection) {\n var focusableSelectors = ['textarea:not([readonly])', 'input[type=\"text\"]:not([readonly])'];\n\n for (var i = 0; i < focusableSelectors.length; i++) {\n var focusable = document.getElementById('trp-translation-section').querySelector(focusableSelectors[i]);\n\n if (focusable) {\n focusable.focus();\n break;\n }\n }\n }\n },\n watch: {\n selectedIndexesArray: function selectedIndexesArray() {\n this.updateLanguages();\n },\n onScreenLanguage: function onScreenLanguage() {\n this.determineLanguageOrder();\n this.updateLanguages();\n }\n },\n computed: {\n othersButtonPosition: function othersButtonPosition() {\n if (this.currentLanguage === this.settings['default-language'] || this.settings['translation-languages'].length <= 2) {\n // don't display it\n return 999;\n } else {\n return this.othersButtonPositionOffset;\n }\n }\n },\n methods: {\n determineLanguageOrder: function determineLanguageOrder() {\n var self = this;\n var filteredLanguages = this.settings['translation-languages'].filter(function (language, index, array) {\n // all languages except default and current or on screen language.\n return self.settings['default-language'] !== language && self.onScreenLanguage !== language;\n });\n this.orderedLanguages = [];\n this.orderedLanguages.push(this.settings['default-language']);\n if (this.onScreenLanguage !== '') this.orderedLanguages.push(this.onScreenLanguage);\n this.orderedLanguages = this.orderedLanguages.concat(filteredLanguages);\n },\n updateLanguages: function updateLanguages() {\n this.languages = [];\n var self = this;\n var defaultLanguage = this.settings['default-language'];\n var translateToDefault = false;\n this.showImageIcon = false;\n this.othersButtonPositionOffset = 1;\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].translationsArray[defaultLanguage]) translateToDefault = true;\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].attribute === 'src') self.showImageIcon = true;\n });\n\n if (translateToDefault) {\n this.languages.push('original');\n this.othersButtonPositionOffset++;\n }\n\n this.languages = this.languages.concat(this.orderedLanguages);\n },\n discardChanges: function discardChanges(selectedIndex, languageCode) {\n this.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation = this.dictionary[selectedIndex].translationsArray[languageCode].translated;\n this.$emit('discarded-changes');\n },\n hasUnsavedChanges: function hasUnsavedChanges(selectedIndex, languageCode) {\n return this.dictionary[selectedIndex].translationsArray[languageCode].translated !== this.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation;\n },\n discardAll: function discardAll() {\n var self = this;\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n self.settings['translation-languages'].forEach(function (languageCode) {\n if (self.dictionary[selectedIndex].translationsArray[languageCode] && self.dictionary[selectedIndex].translationsArray[languageCode].translated !== self.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation) {\n self.discardChanges(selectedIndex, languageCode);\n }\n });\n });\n\n if (this.$parent.mergingString === true) {\n this.$parent.selectedString = null;\n var previouslyHighlighted = this.iframe.getElementsByClassName('trp-create-translation-block');\n\n if (previouslyHighlighted.length > 0) {\n var i;\n\n for (i = 0; i < previouslyHighlighted.length; i++) {\n previouslyHighlighted[i].classList.remove('trp-highlight');\n previouslyHighlighted[i].classList.remove('trp-create-translation-block');\n }\n }\n\n this.$parent.mergingString = false;\n this.$parent.mergeData = [];\n }\n },\n addKeyboardShortcutsListener: function addKeyboardShortcutsListener() {\n document.addEventListener(\"keydown\", function (e) {\n // CTRL + ALT + Z\n if ((window.navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) && e.altKey && e.keyCode === 90) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_discard_all_changes_event'));\n }\n }, false);\n window.addEventListener('trp_trigger_discard_all_changes_event', this.discardAll);\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vYXNzZXRzL3NyYy9qcy9jb21wb25lbnRzL2xhbmd1YWdlLWJveGVzLnZ1ZT80OWJjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDQTtBQUNBO0FBQ0EsVUFDQSxzQkFEQSxFQUVBLFlBRkEsRUFHQSxpQkFIQSxFQUlBLGtCQUpBLEVBS0EsZUFMQSxFQU1BLFVBTkEsRUFPQSwyQkFQQSxFQVFBLGVBUkEsRUFTQSxXQVRBLEVBVUEsUUFWQSxDQURBO0FBYUEsTUFiQSxrQkFhQTtBQUNBO0FBQ0EsbUJBREE7QUFFQTtBQUFBO0FBQUEsNEJBRkE7QUFHQSxtQ0FIQTtBQUlBLCtCQUpBO0FBS0EsMEJBTEE7QUFNQTtBQU5BO0FBUUEsR0F0QkE7QUF1QkE7QUFDQTtBQURBLEdBdkJBO0FBMEJBLFNBMUJBLHFCQTBCQTtBQUNBO0FBQ0E7QUFDQSxHQTdCQTtBQThCQSxTQTlCQSxxQkE4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUpBLENBS0E7OztBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQS9DQTtBQWdEQTtBQUNBO0FBQ0E7QUFDQSxLQUhBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFQQSxHQWhEQTtBQXlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FIQSxNQUdBO0FBQ0E7QUFDQTtBQUNBO0FBUkEsR0F6REE7QUFtRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FIQTtBQUlBO0FBQ0E7QUFDQSx3Q0FDQTtBQUNBO0FBQ0EsS0FaQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQSxpSEFDQTtBQUNBLGtHQUNBO0FBQ0EsT0FMQTs7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBbENBO0FBbUNBO0FBQ0E7QUFDQTtBQUNBLEtBdENBO0FBdUNBO0FBQ0E7QUFDQSxLQXpDQTtBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUNBLDhKQURBLEVBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FMQTtBQU1BLE9BUEE7O0FBU0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQWxFQTtBQW1FQSxnQ0FuRUEsMENBbUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQSxFQU1BLEtBTkE7QUFRQTtBQUNBO0FBN0VBO0FBbkVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL2Fzc2V0cy9zcmMvanMvY29tcG9uZW50cy9sYW5ndWFnZS1ib3hlcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gICAgPGRpdiBpZD1cInRycC10cmFuc2xhdGlvbi1zZWN0aW9uXCIgY2xhc3M9XCJ0cnAtY29udHJvbHMtc2VjdGlvbi1jb250ZW50XCIgdi1pZj1cInNlbGVjdGVkSW5kZXhlc0FycmF5XCI+XHJcbiAgICAgICAgPGRpdiB2LXNob3c9XCJzaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlXCIgY2xhc3M9XCJ0cnAtY2hhbmdlcy11bnNhdmVkLW1lc3NhZ2VcIj57eyBlZGl0b3JTdHJpbmdzLnVuc2F2ZWRfY2hhbmdlcyB9fSA8c3BhbiBjbGFzcz1cInRycC11bnNhdmVkLWNoYW5nZXMgdHJwLWRpc2NhcmQtY2hhbmdlcyBcIkBjbGljaz1cImRpc2NhcmRBbGxcIiA6dGl0bGU9XCJlZGl0b3JTdHJpbmdzLmRpc2NhcmRfYWxsX3RpdGxlX2F0dHJcIj57eyBlZGl0b3JTdHJpbmdzLmRpc2NhcmRfYWxsIH19PC9zcGFuPj88L2Rpdj5cclxuICAgICAgICA8ZGl2IHYtZm9yPVwiKGxhbmd1YWdlQ29kZSwga2V5KSBpbiBsYW5ndWFnZXNcIiA6aWQ9XCIndHJwLWxhbmd1YWdlLScgKyBsYW5ndWFnZUNvZGVcIj5cclxuICAgICAgICAgICAgPGRpdiB2LXNob3c9XCIoIChrZXkgPD0gb3RoZXJzQnV0dG9uUG9zaXRpb24pIHx8IHNob3dPdGhlckxhbmd1YWdlcyApICYmICggc2VsZWN0ZWRJbmRleGVzQXJyYXkgJiYgc2VsZWN0ZWRJbmRleGVzQXJyYXkubGVuZ3RoID4gMCApXCIgIGNsYXNzPVwidHJwLWxhbmd1YWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1sYW5ndWFnZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImtleSA9PSAwIFwiPnt7IGVkaXRvclN0cmluZ3MuZnJvbSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1lbHNlPnt7IGVkaXRvclN0cmluZ3MudG8gfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbXBsZXRlTGFuZ3VhZ2VOYW1lc1tsYW5ndWFnZUNvZGVdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyB2LWlmPVwibGFuZ3VhZ2VDb2RlICE9ICdvcmlnaW5hbCdcIiBjbGFzcz1cInRycC1sYW5ndWFnZS1ib3gtZmxhZy1pbWFnZVwiIDpzcmM9XCJmbGFnc1BhdGhbbGFuZ3VhZ2VDb2RlXSArICcvJyArIGxhbmd1YWdlQ29kZSArICcucG5nJ1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxMlwiIDphbHQ9XCJsYW5ndWFnZUNvZGVcIiA6dGl0bGU9XCJjb21wbGV0ZUxhbmd1YWdlTmFtZXNbbGFuZ3VhZ2VDb2RlXVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0cnAtdHJhbnNsYXRpb25zLWZvci1sYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRycC10cmFuc2xhdGlvbi1pY29uLWNvbnRhaW5lclwiIHYtaWY9XCJzaG93SW1hZ2VJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJwLXRyYW5zbGF0aW9uLWljb24gZGFzaGljb25zIGRhc2hpY29ucy1mb3JtYXQtaW1hZ2VcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0cnAtdHJhbnNsYXRpb25zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLXN0cmluZy1jb250YWluZXJcIiB2LWZvcj1cInNlbGVjdGVkSW5kZXggaW4gc2VsZWN0ZWRJbmRleGVzQXJyYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0gJiYgZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdXCIgOmtleT1cInNlbGVjdGVkSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNsYXRpb24taW5wdXQgOnN0cmluZz1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cIiB2LW1vZGVsPVwiZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLmVkaXRlZFRyYW5zbGF0aW9uXCIgOmhpZ2hsaWdodFVuc2F2ZWRDaGFuZ2VzPVwic2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSAmJiBoYXNVbnNhdmVkQ2hhbmdlcyggc2VsZWN0ZWRJbmRleCwgbGFuZ3VhZ2VDb2RlIClcIiA6ZWRpdG9yU3RyaW5ncz1cImVkaXRvclN0cmluZ3NcIj48L3RyYW5zbGF0aW9uLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cIiA6a2V5PVwic2VsZWN0ZWRJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2xhdGlvbi1pbnB1dCA6cmVhZG9ubHk9XCJ0cnVlXCIgOnN0cmluZz1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cIiA6dmFsdWU9XCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLm9yaWdpbmFsXCIgOmVkaXRvclN0cmluZ3M9XCJlZGl0b3JTdHJpbmdzXCI+PC90cmFuc2xhdGlvbi1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC10cmFuc2xhdGlvbi1pbnB1dC1mb290ZXJcIiA6ZGF0YS1kaWN0aW9uYXJ5LWVudHJ5PVwiSlNPTi5zdHJpbmdpZnkoZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLWF0dHJpYnV0ZS1uYW1lXCIgIHYtc2hvdz1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0uYXR0cmlidXRlICE9ICdjb250ZW50JyB8fCBkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLmF0dHJpYnV0ZSAhPSAnJ1wiPnt7ICggZWRpdG9yU3RyaW5nc1sgZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgXSApID8gZWRpdG9yU3RyaW5nc1sgZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgXSA6IGVkaXRvclN0cmluZ3MudGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0gJiYgZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdXCIgY2xhc3M9XCJ0cnAtZGlzY2FyZC1jaGFuZ2VzIHRycC1kaXNjYXJkLWluZGl2aWR1YWwtY2hhbmdlc1wiIEBjbGljaz1cImRpc2NhcmRDaGFuZ2VzKHNlbGVjdGVkSW5kZXgsbGFuZ3VhZ2VDb2RlKVwiIDpjbGFzcz1cInsndHJwLXVuc2F2ZWQtY2hhbmdlcyc6IGhhc1Vuc2F2ZWRDaGFuZ2VzKCBzZWxlY3RlZEluZGV4LCBsYW5ndWFnZUNvZGUgKSB9XCIgOnRpdGxlPVwiZWRpdG9yU3RyaW5ncy5kaXNjYXJkX2luZGl2aWR1YWxfY2hhbmdlc190aXRsZV9hdHRyaWJ1dGVcIj57eyBlZGl0b3JTdHJpbmdzLmRpc2NhcmQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgdi1zaG93PVwia2V5ID09IG90aGVyc0J1dHRvblBvc2l0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC10b2dnbGUtbGFuZ3VhZ2VzXCIgQGNsaWNrPVwic2hvd090aGVyTGFuZ3VhZ2VzID0gIXNob3dPdGhlckxhbmd1YWdlc1wiIDpjbGFzcz1cInsgJ3RycC1zaG93LW90aGVyLWxhbmd1YWdlcyc6IHNob3dPdGhlckxhbmd1YWdlcywgJ3RycC1oaWRlLW90aGVyLWxhbmd1YWdlcyc6ICFzaG93T3RoZXJMYW5ndWFnZXMgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAoc2hvd090aGVyTGFuZ3VhZ2VzKT8gJyYjMTEyMDY7JyA6ICcmIzExMjA4OycgfX0ge3sgZWRpdG9yU3RyaW5ncy5vdGhlcl9sYW5nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0PlxyXG4gICAgaW1wb3J0IHRyYW5zbGF0aW9uSW5wdXQgZnJvbSAnLi90cmFuc2xhdGlvbi1pbnB1dC52dWUnXHJcbiAgICBleHBvcnQgZGVmYXVsdHtcclxuICAgICAgICBwcm9wczpbXHJcbiAgICAgICAgICAgICdzZWxlY3RlZEluZGV4ZXNBcnJheScsXHJcbiAgICAgICAgICAgICdkaWN0aW9uYXJ5JyxcclxuICAgICAgICAgICAgJ2N1cnJlbnRMYW5ndWFnZScsXHJcbiAgICAgICAgICAgICdvblNjcmVlbkxhbmd1YWdlJyxcclxuICAgICAgICAgICAgJ2xhbmd1YWdlTmFtZXMnLFxyXG4gICAgICAgICAgICAnc2V0dGluZ3MnLFxyXG4gICAgICAgICAgICAnc2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZScsXHJcbiAgICAgICAgICAgICdlZGl0b3JTdHJpbmdzJyxcclxuICAgICAgICAgICAgJ2ZsYWdzUGF0aCcsXHJcbiAgICAgICAgICAgICdpZnJhbWUnXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkYXRhKCl7XHJcbiAgICAgICAgICAgIHJldHVybntcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlcyAgICAgICAgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUxhbmd1YWdlTmFtZXMgICAgICA6IE9iamVjdC5hc3NpZ24oIHsgJ29yaWdpbmFsJzogJ09yaWdpbmFsIFN0cmluZycgfSwgdGhpcy5sYW5ndWFnZU5hbWVzICksXHJcbiAgICAgICAgICAgICAgICBvdGhlcnNCdXR0b25Qb3NpdGlvbk9mZnNldCA6IDEsXHJcbiAgICAgICAgICAgICAgICBzaG93T3RoZXJMYW5ndWFnZXMgICAgICAgICA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgb3JkZXJlZExhbmd1YWdlcyAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgICAgICAgIHNob3dJbWFnZUljb24gICAgICAgICAgICAgIDogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wb25lbnRzOntcclxuICAgICAgICAgICAgdHJhbnNsYXRpb25JbnB1dFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbW91bnRlZCgpe1xyXG4gICAgICAgICAgICB0aGlzLmRldGVybWluZUxhbmd1YWdlT3JkZXIoKVxyXG4gICAgICAgICAgICB0aGlzLmFkZEtleWJvYXJkU2hvcnRjdXRzTGlzdGVuZXIoKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXBkYXRlZCgpe1xyXG4gICAgICAgICAgICAvLyBpZiBhbHJlYWR5IGFjdGl2ZSBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIGlmICggZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoICd0cnAtdHJhbnNsYXRpb24taW5wdXQnICkpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcGxhY2UgdGhlIGN1cnNvciBpbiB0aGUgZmlyc3QgdGV4dGFyZWEgb3IgaW5wdXQgZm9yIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2xhdGlvblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RycC10cmFuc2xhdGlvbi1zZWN0aW9uJyApXHJcbiAgICAgICAgICAgIGlmICggdHJhbnNsYXRpb25TZWN0aW9uICkgIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb2N1c2FibGVTZWxlY3RvcnMgPSBbJ3RleHRhcmVhOm5vdChbcmVhZG9ubHldKScsICdpbnB1dFt0eXBlPVwidGV4dFwiXTpub3QoW3JlYWRvbmx5XSknXVxyXG4gICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpPGZvY3VzYWJsZVNlbGVjdG9ycy5sZW5ndGg7IGkrKyApe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c2FibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RycC10cmFuc2xhdGlvbi1zZWN0aW9uJyApLnF1ZXJ5U2VsZWN0b3IoZm9jdXNhYmxlU2VsZWN0b3JzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggZm9jdXNhYmxlICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGUuZm9jdXMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdhdGNoOiB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSW5kZXhlc0FycmF5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlcygpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uU2NyZWVuTGFuZ3VhZ2U6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVybWluZUxhbmd1YWdlT3JkZXIoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZXMoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wdXRlZDp7XHJcbiAgICAgICAgICAgIG90aGVyc0J1dHRvblBvc2l0aW9uOiBmdW5jdGlvbiAoKXtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZSA9PT0gdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddIHx8IHRoaXMuc2V0dGluZ3NbJ3RyYW5zbGF0aW9uLWxhbmd1YWdlcyddLmxlbmd0aCA8PSAyICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk5XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vdGhlcnNCdXR0b25Qb3NpdGlvbk9mZnNldFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRob2RzOntcclxuICAgICAgICAgICAgZGV0ZXJtaW5lTGFuZ3VhZ2VPcmRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRMYW5ndWFnZXMgPSB0aGlzLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5maWx0ZXIoZnVuY3Rpb24obGFuZ3VhZ2UsIGluZGV4LCBhcnJheSl7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxhbmd1YWdlcyBleGNlcHQgZGVmYXVsdCBhbmQgY3VycmVudCBvciBvbiBzY3JlZW4gbGFuZ3VhZ2UuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggc2VsZi5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddICE9PSBsYW5ndWFnZSApICYmICggc2VsZi5vblNjcmVlbkxhbmd1YWdlICE9PSBsYW5ndWFnZSApXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJlZExhbmd1YWdlcyA9IFtdXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyZWRMYW5ndWFnZXMucHVzaCggdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddIClcclxuICAgICAgICAgICAgICAgIGlmICggdGhpcy5vblNjcmVlbkxhbmd1YWdlICE9PSAnJyApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlcmVkTGFuZ3VhZ2VzLnB1c2goIHRoaXMub25TY3JlZW5MYW5ndWFnZSApXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyZWRMYW5ndWFnZXMgPSB0aGlzLm9yZGVyZWRMYW5ndWFnZXMuY29uY2F0KCBmaWx0ZXJlZExhbmd1YWdlcyApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZUxhbmd1YWdlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMgICAgICAgICAgICAgICAgICA9IFtdXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpc1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRMYW5ndWFnZSAgICAgICAgICAgICA9IHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXVxyXG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZVRvRGVmYXVsdCAgICAgICAgICA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dJbWFnZUljb24gICAgICAgICAgICAgID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJzQnV0dG9uUG9zaXRpb25PZmZzZXQgPSAxXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3RlZEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSAmJiBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbZGVmYXVsdExhbmd1YWdlXSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVRvRGVmYXVsdCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICBpZiggc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmIHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS5hdHRyaWJ1dGUgPT09ICdzcmMnIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93SW1hZ2VJY29uID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlVG9EZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMucHVzaCgnb3JpZ2luYWwnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3RoZXJzQnV0dG9uUG9zaXRpb25PZmZzZXQrK1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZXMuY29uY2F0KHRoaXMub3JkZXJlZExhbmd1YWdlcylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzY2FyZENoYW5nZXM6IGZ1bmN0aW9uKHNlbGVjdGVkSW5kZXgsbGFuZ3VhZ2VDb2RlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLmVkaXRlZFRyYW5zbGF0aW9uID0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0udHJhbnNsYXRlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnZGlzY2FyZGVkLWNoYW5nZXMnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBoYXNVbnNhdmVkQ2hhbmdlczogZnVuY3Rpb24oc2VsZWN0ZWRJbmRleCwgbGFuZ3VhZ2VDb2RlKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0udHJhbnNsYXRlZCAhPT0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0uZWRpdGVkVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRpc2NhcmRBbGw6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkuZm9yRWFjaChmdW5jdGlvbihzZWxlY3RlZEluZGV4KXtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5mb3JFYWNoKCBmdW5jdGlvbiggbGFuZ3VhZ2VDb2RlICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLnRyYW5zbGF0ZWQgIT09IHNlbGYuZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtsYW5ndWFnZUNvZGVdLmVkaXRlZFRyYW5zbGF0aW9uKSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzY2FyZENoYW5nZXMoc2VsZWN0ZWRJbmRleCxsYW5ndWFnZUNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuJHBhcmVudC5tZXJnaW5nU3RyaW5nID09PSB0cnVlICl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LnNlbGVjdGVkU3RyaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQgPSB0aGlzLmlmcmFtZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCAndHJwLWNyZWF0ZS10cmFuc2xhdGlvbi1ibG9jaycgKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQubGVuZ3RoID4gMCApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwcmV2aW91c2x5SGlnaGxpZ2h0ZWQubGVuZ3RoOyBpKysgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5SGlnaGxpZ2h0ZWRbaV0uY2xhc3NMaXN0LnJlbW92ZSgndHJwLWhpZ2hsaWdodCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5SGlnaGxpZ2h0ZWRbaV0uY2xhc3NMaXN0LnJlbW92ZSgndHJwLWNyZWF0ZS10cmFuc2xhdGlvbi1ibG9jaycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50Lm1lcmdpbmdTdHJpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5tZXJnZURhdGEgPSBbXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhZGRLZXlib2FyZFNob3J0Y3V0c0xpc3RlbmVyKCl7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIFpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goXCJNYWNcIikgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXkpICYmIGUuYWx0S2V5ICYmIGUua2V5Q29kZSA9PT0gOTAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd0cnBfdHJpZ2dlcl9kaXNjYXJkX2FsbF9jaGFuZ2VzX2V2ZW50JykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RycF90cmlnZ2VyX2Rpc2NhcmRfYWxsX2NoYW5nZXNfZXZlbnQnLCB0aGlzLmRpc2NhcmRBbGwgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG48L3NjcmlwdD5cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/components/language-boxes.vue?vue&type=script&lang=js&\n");
683
 
684
  /***/ }),
685
 
715
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
716
 
717
  "use strict";
718
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! select2/dist/js/select2.min.js */ \"./node_modules/select2/dist/js/select2.min.js\");\n/* harmony import */ var select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(select2_dist_js_select2_min_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./assets/src/js/utils.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_language_boxes_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/language-boxes.vue */ \"./assets/src/js/components/language-boxes.vue\");\n/* harmony import */ var _components_save_translations_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/save-translations.vue */ \"./assets/src/js/components/save-translations.vue\");\n/* harmony import */ var _components_hover_actions_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/hover-actions.vue */ \"./assets/src/js/components/hover-actions.vue\");\n/* harmony import */ var _components_extra_content_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/extra-content.vue */ \"./assets/src/js/components/extra-content.vue\");\n/* harmony import */ var he__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! he */ \"./node_modules/he/he.js\");\n/* harmony import */ var he__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(he__WEBPACK_IMPORTED_MODULE_7__);\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: ['trp_settings', 'language_names', 'ordered_secondary_languages', 'current_language', 'on_screen_language', 'view_as_roles', 'url_to_load', 'string_selectors', 'data_attributes', 'ajax_url', 'editor_nonces', 'string_group_order', 'merge_rules', 'localized_text', 'paid_version', 'flags_path'],\n components: {\n languageBoxes: _components_language_boxes_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n saveTranslations: _components_save_translations_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n hoverActions: _components_hover_actions_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n extraContent: _components_extra_content_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n },\n data: function data() {\n return {\n //props\n settings: JSON.parse(this.trp_settings),\n languageNames: JSON.parse(this.language_names),\n orderedSecondaryLanguages: JSON.parse(this.ordered_secondary_languages),\n roles: JSON.parse(this.view_as_roles),\n nonces: JSON.parse(this.editor_nonces),\n stringGroupOrder: JSON.parse(this.string_group_order),\n selectors: JSON.parse(this.string_selectors),\n dataAttributes: JSON.parse(this.data_attributes),\n mergeRules: JSON.parse(this.merge_rules),\n editorStrings: JSON.parse(this.localized_text),\n flagsPath: JSON.parse(this.flags_path),\n //data\n currentLanguage: this.current_language,\n onScreenLanguage: this.on_screen_language,\n currentURL: this.url_to_load,\n urlToLoad: this.url_to_load,\n iframe: '',\n dictionary: [],\n selectedString: null,\n selectedIndexesArray: [],\n detectedSelectorAndId: [],\n stringGroups: [],\n mergingString: false,\n mergeData: [],\n showChangesUnsavedMessage: false,\n viewAs: '',\n loading_strings: 0,\n translationNotLoadedYet: false\n };\n },\n created: function created() {\n this.settings['default-language-name'] = this.languageNames[this.settings['default-language']]; //set default value for the View As select\n\n var params = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getUrlParameters(this.currentURL);\n if (Object.keys(params).length > 1 && params['trp-view-as']) this.viewAs = params['trp-view-as'];else this.viewAs = 'current_user';\n },\n mounted: function mounted() {\n this.addKeyboardShortcutsListener();\n var self = this; // initialize select2\n\n jQuery('#trp-language-select, #trp-view-as-select').select2({\n width: '100%'\n }); //init strings dropdown\n\n this.stringsDropdownLoading(); // show overlay when select is opened\n\n jQuery('#trp-language-select, #trp-string-categories').on('select2:open', function () {\n jQuery('#trp_select2_overlay').fadeIn('100');\n }).on('select2:close', function () {\n jQuery('#trp_select2_overlay').hide();\n }).on('select2:opening', function (e) {\n /* when we have unsaved changes prevent the strings dropdown from opening so we do not have a disconnect between the textareas and the dropdown */\n if (self.hasUnsavedChanges()) {\n e.preventDefault();\n }\n }); // resize sidebar and consequently the iframe\n\n var previewContainer = jQuery('#trp-preview');\n var total_width = jQuery(window).width();\n jQuery('#trp-controls').resizable({\n start: function start() {\n previewContainer.toggle();\n },\n stop: function stop() {\n previewContainer.toggle();\n },\n handles: 'e',\n minWidth: 285,\n maxWidth: total_width - 20\n }).bind(\"resize\", this.resizeIframe); // resize iframe when resizing window\n\n jQuery(window).resize(function () {\n self.resizeIframe();\n });\n },\n watch: {\n currentLanguage: function currentLanguage(_currentLanguage) {\n var self = this; //grab the correct URL from the iFrame\n\n var newURL = this.iframe.querySelector('link[hreflang=\"' + _currentLanguage.replace('_', '-') + '\"]').getAttribute('href');\n this.currentURL = newURL;\n this.iframe.location = newURL; //reset vue props\n\n this.selectedString = '';\n this.selectedIndexesArray = []; //set strings dropdown to loading state\n\n jQuery('#trp-string-categories').val('').trigger('change');\n this.stringsDropdownLoading();\n this.onScreenLanguage = _currentLanguage;\n\n if (this.settings['default-language'] == this.currentLanguage && this.settings['translation-languages'].length > 1) {\n this.settings['translation-languages'].some(function (language) {\n if (language != self.settings['default-language']) {\n // return the first language not default\n self.onScreenLanguage = language;\n return true;\n }\n });\n }\n },\n currentURL: function currentURL(newUrl, oldUrl) {\n window.history.replaceState(null, null, this.parentURL(newUrl));\n },\n viewAs: function viewAs(role) {\n if (!this.currentURL || !this.iframe) return;\n var url = this.cleanURL(this.currentURL);\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-edit-translation', 'preview');\n\n if (role == 'current_user') {\n this.iframe.location = url;\n return;\n } //if nonce not available, an update to the Browse as Other Roles add-on is required\n\n\n if (!this.nonces[role]) {\n alert(this.editorStrings.bor_update_notice);\n return;\n }\n\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-view-as', role);\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].updateUrlParameter(url, 'trp-view-as-nonce', this.nonces[role]);\n this.iframe.location = url;\n },\n selectedString: function selectedString(selectedStringArrayIndex, oldString) {\n if (this.hasUnsavedChanges() || !selectedStringArrayIndex && selectedStringArrayIndex !== 0) return;\n jQuery('#trp-string-categories').val(selectedStringArrayIndex !== null ? selectedStringArrayIndex : '').trigger('change');\n var selectedString = this.dictionary[selectedStringArrayIndex];\n if (!selectedString) return;\n var currentNode = this.iframe.querySelector(\"[\" + selectedString.selector + \"='\" + selectedString.dbID + \"']\");\n var selectedIndexesArray = []; //when merging we do not have a valid current node, so we just add the fake id\n\n if (currentNode) {\n var self = this;\n var selectors = self.getAllSelectors();\n var nodes = [];\n nodes.push(currentNode);\n\n if (currentNode.tagName != \"A\") {\n // include the anchor's translatable attributes\n var anchorParent = currentNode.closest('a');\n\n if (anchorParent != null) {\n nodes.push(anchorParent);\n }\n }\n\n if (currentNode.tagName == \"A\" && currentNode.children.length > 0) {\n // include all the translatable attributes inside the anchor\n var childrenArray = _toConsumableArray(currentNode.children);\n\n childrenArray.forEach(function (child) {\n nodes.push(child);\n });\n }\n\n nodes.forEach(function (node) {\n selectors.forEach(function (selector) {\n var stringId = node.getAttribute(selector);\n\n if (stringId) {\n var found = false;\n var i;\n\n for (i = 0; i < selectedIndexesArray.length; i++) {\n if (typeof self.dictionary[selectedIndexesArray[i]] !== 'undefined' && self.dictionary[selectedIndexesArray[i]].dbID !== 'undefined' && self.dictionary[selectedIndexesArray[i]].dbID === stringId) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n selectedIndexesArray.push(self.getStringIndex(selector, stringId));\n }\n }\n });\n });\n } else selectedIndexesArray.push(selectedStringArrayIndex);\n\n this.selectedIndexesArray = selectedIndexesArray;\n }\n },\n computed: {\n closeURL: function closeURL() {\n return this.cleanURL(this.currentURL);\n }\n },\n methods: {\n iFrameLoaded: function iFrameLoaded() {\n var self = this;\n var iframeElement = document.querySelector('#trp-preview-iframe');\n this.iframe = iframeElement.contentDocument || iframeElement.contentWindow.document; //sync iFrame URL with parent\n\n if (this.currentURL != this.iframe.URL) this.currentURL = this.iframe.URL; //hide iFrame loader\n\n this.iframeLoader('hide');\n self.detectedSelectorAndId = [];\n self.dictionary = [];\n this.scanIframeForStrings();\n window.addEventListener('trp_iframe_page_updated', this.scanIframeForStrings); //event that is fired when the iFrame is navigated\n\n iframeElement.contentWindow.onbeforeunload = function () {\n self.iframeLoader('show');\n self.selectedString = null;\n self.selectedIndexesArray = [];\n self.translationNotLoadedYet = false;\n self.stringsDropdownLoading();\n };\n },\n scanIframeForStrings: function scanIframeForStrings() {\n this.scanForSelector('data-trp-translate-id', 'regular', this.onScreenLanguage);\n this.scanForSelector('data-trpgettextoriginal', 'gettext', this.currentLanguage);\n this.scanForSelector('data-trp-post-slug', 'postslug', this.currentLanguage);\n },\n scanForSelector: function scanForSelector(baseSelector, typeSlug, languageOfIds) {\n this.loading_strings++;\n var self = this;\n var selectors = this.prepareSelectorStrings(baseSelector);\n\n var nodes = _toConsumableArray(this.iframe.querySelectorAll('[' + selectors.join('],[') + ']'));\n\n var stringIdsArray = [],\n nodeData = [],\n nodeEntries = [];\n nodes.forEach(function (node) {\n nodeEntries = self.getNodeInfo(node, baseSelector);\n nodeEntries.forEach(function (entry) {\n // this check ensures that we don't create duplicates when rescanning after ajax complete\n if (!self.alreadyDetected(entry.selector, entry.dbID)) {\n stringIdsArray.push(entry.dbID);\n nodeData.push(entry);\n }\n });\n self.setupEventListener(node);\n }); //unique ids only\n\n stringIdsArray = _toConsumableArray(new Set(stringIdsArray));\n\n if (stringIdsArray.length > 0) {\n var data = new FormData();\n data.append('action', 'trp_get_translations_' + typeSlug);\n data.append('all_languages', 'true');\n data.append('security', this.nonces['gettranslationsnonce' + typeSlug]);\n data.append('language', languageOfIds);\n data.append('string_ids', JSON.stringify(stringIdsArray));\n axios__WEBPACK_IMPORTED_MODULE_2___default.a.post(this.ajax_url, data).then(function (response) {\n self.loading_strings--;\n self.addToDictionary(response.data, nodeData);\n })[\"catch\"](function (error) {\n console.log(error);\n });\n } else {\n self.loading_strings--;\n }\n },\n alreadyDetected: function alreadyDetected(selector, dbId) {\n var combined = selector + '=' + dbId;\n\n if (_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].arrayContainsItem(this.detectedSelectorAndId, combined)) {\n return true;\n } else {\n this.detectedSelectorAndId.push(combined);\n return false;\n }\n },\n setupEventListener: function setupEventListener(node) {\n if (node.tagName == 'A' && !node.hasAttribute('data-trpgettextoriginal')) return false;\n var self = this;\n node.addEventListener('mouseenter', self.$refs.hoverActions.showPencilIcon);\n },\n addToDictionary: function addToDictionary(responseData) {\n var nodeInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var self = this;\n\n if (responseData != null) {\n if (nodeInfo) {\n nodeInfo.forEach(function (infoRow, index) {\n responseData.some(function (responseDataRow) {\n if (infoRow.dbID == responseDataRow.dbID) {\n //bring block_type to the top level object\n if (responseDataRow.type != 'gettext' && typeof responseDataRow.block_type == 'undefined') {\n var firstLanguage = self.orderedSecondaryLanguages[0];\n if (typeof responseDataRow.translationsArray[firstLanguage].block_type != 'undefined') responseDataRow.block_type = responseDataRow.translationsArray[firstLanguage].block_type;\n }\n\n nodeInfo[index] = Object.assign({}, responseDataRow, infoRow);\n return true; // a sort of break\n }\n });\n });\n } else {\n nodeInfo = responseData;\n }\n\n this.stringGroups = this.addToStringGroups(nodeInfo);\n this.dictionary = this.dictionary.concat(nodeInfo);\n this.initStringsDropdown();\n }\n },\n addToStringGroups: function addToStringGroups(strings) {\n // see what node groups are found\n var foundStringGroups = this.stringGroups;\n strings.forEach(function (string) {\n if (foundStringGroups.indexOf(string.group) === -1 && (typeof string.blockType === 'undefined' || string.blockType !== '2')) {\n foundStringGroups.push(string.group);\n }\n }); // put the node groups in the order that we want, according to the prop this.stringGroupOrder\n\n var orderedStringGroups = [];\n\n if (this.editorStrings.seo_update_notice != 'seo_pack_update_not_needed') {\n orderedStringGroups.push(this.editorStrings.seo_update_notice);\n }\n\n this.stringGroupOrder.forEach(function (group) {\n if (foundStringGroups.indexOf(group) !== -1) {\n orderedStringGroups.push(group);\n }\n }); // if there were any other string groups that were not in the prop, add them at the end.\n\n foundStringGroups.forEach(function (group) {\n if (orderedStringGroups.indexOf(group) === -1) {\n orderedStringGroups.push(group);\n }\n });\n return orderedStringGroups;\n },\n getStringIndex: function getStringIndex(selector, dbID) {\n var found = null;\n this.dictionary.some(function (string, index) {\n if (string.dbID == dbID && string.selector == selector) {\n found = index;\n return true;\n }\n });\n return found;\n },\n getNodeInfo: function getNodeInfo(node) {\n var baseSelector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var stringId;\n var nodeData = [];\n var selectors = this.prepareSelectorStrings(baseSelector);\n selectors.forEach(function (selector) {\n stringId = node.getAttribute(selector);\n\n if (stringId) {\n var nodeAttribute = selector.replace(baseSelector, '');\n var nodeGroup = node.getAttribute('data-trp-node-group' + nodeAttribute);\n var nodeDescription = node.getAttribute('data-trp-node-description' + nodeAttribute);\n var entry = {\n dbID: stringId,\n selector: selector,\n attribute: nodeAttribute.substr(1) // substr(1) is used to trim prefixing line - ex. -alt will result in alt (no line)\n\n };\n if (nodeGroup) entry.group = nodeGroup;\n if (nodeDescription) entry.description = nodeDescription;\n nodeData.push(entry);\n }\n });\n return nodeData;\n },\n getAllSelectors: function getAllSelectors() {\n var selectors = [];\n var self = this;\n this.dataAttributes.forEach(function (dataAttribute) {\n selectors = selectors.concat(self.prepareSelectorStrings(dataAttribute));\n });\n return selectors;\n },\n prepareSelectorStrings: function prepareSelectorStrings(baseNameSelector) {\n var parsed_selectors = [];\n this.selectors.forEach(function (selectorSuffix, index) {\n parsed_selectors.push(baseNameSelector + selectorSuffix);\n });\n return parsed_selectors;\n },\n parentURL: function parentURL(url) {\n return url.replace('trp-edit-translation=preview', 'trp-edit-translation=true');\n },\n cleanURL: function cleanURL(url) {\n //make removeUrlParameter recursive and only call it once with all the parameters that\n //need to stripped ?\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'lang');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-view-as');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-view-as-nonce');\n url = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].removeUrlParameter(url, 'trp-edit-translation');\n return url;\n },\n showString: function showString(string, type) {\n if (typeof string.blockType !== 'undefined' && string.blockType === '2') {\n // don't show deprecated translation blocks in the dropdown\n return false;\n }\n\n if (type === this.editorStrings.images && typeof string.attribute != 'undefined' && string.attribute == 'src') return true;\n if (typeof string.attribute !== 'undefined' && (string.attribute == 'href' || string.attribute == 'src')) return false;\n if (string.group === type) return true;\n return false;\n },\n initStringsDropdown: function initStringsDropdown() {\n var self = this;\n\n if (!this.isStringsDropdownOpen()) {\n jQuery('#trp-string-categories').select2('destroy');\n jQuery('#trp-string-categories').select2({\n placeholder: self.editorStrings.select_string,\n templateResult: function templateResult(option) {\n var original = he__WEBPACK_IMPORTED_MODULE_7___default.a.decode(option.text.substring(0, 90)) + (option.text.length <= 90 ? '' : '...');\n var description = option.title ? '(' + option.title + ')' : '';\n return jQuery('<div>' + original + '</div><div class=\"string-selector-description\">' + description + '</div>');\n },\n width: '100%'\n }).prop('disabled', false);\n jQuery('#trp_select2_overlay').hide();\n }\n },\n stringsDropdownLoading: function stringsDropdownLoading() {\n jQuery('#trp-string-categories').select2({\n placeholder: this.editorStrings.strings_loading,\n width: '100%'\n }).prop('disabled', true);\n },\n processOptionName: function processOptionName(name, type) {\n if (type == 'Images') return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getFilename(name);\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].escapeHtml(name);\n },\n isStringsDropdownOpen: function isStringsDropdownOpen() {\n return jQuery('#trp-string-categories').select2('isOpen');\n },\n hasUnsavedChanges: function hasUnsavedChanges() {\n var unsavedChanges = false;\n var self = this;\n\n if (this.selectedIndexesArray.length > 0) {\n this.selectedIndexesArray.forEach(function (selectedIndex) {\n self.settings['translation-languages'].forEach(function (languageCode) {\n if (self.dictionary[selectedIndex] && self.dictionary[selectedIndex].translationsArray[languageCode] && self.dictionary[selectedIndex].translationsArray[languageCode].translated !== self.dictionary[selectedIndex].translationsArray[languageCode].editedTranslation) {\n unsavedChanges = true;\n }\n });\n });\n }\n\n this.showChangesUnsavedMessage = unsavedChanges;\n return unsavedChanges;\n },\n iframeLoader: function iframeLoader(status) {\n var loader = document.getElementById('trp-preview-loader');\n if (status == 'show') loader.style.display = 'flex';else if (status == 'hide') loader.style.display = 'none';\n },\n previousString: function previousString() {\n var currentValue = document.getElementById('trp-string-categories').value;\n var newValue = +currentValue - 1;\n\n while (newValue >= 0 && document.querySelectorAll('#trp-string-categories option[value=\"' + newValue + '\"]').length === 0) {\n newValue--;\n }\n\n if (newValue < 0) return;\n this.selectedString = newValue.toString();\n },\n nextString: function nextString() {\n var currentValue = document.getElementById('trp-string-categories').value,\n newValue = 0;\n if (currentValue != '') newValue = +currentValue + 1;\n\n while (newValue < this.dictionary.length && document.querySelectorAll('#trp-string-categories option[value=\"' + newValue + '\"]').length === 0) {\n newValue++;\n }\n\n if (newValue >= this.dictionary.length) {\n return;\n }\n\n this.selectedString = newValue.toString();\n },\n addKeyboardShortcutsListener: function addKeyboardShortcutsListener() {\n document.addEventListener(\"keydown\", function (e) {\n if ((window.navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) && e.altKey) {\n // CTRL + ALT + right arrow\n if (e.keyCode === 39) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_next_string_event'));\n } else {\n // CTRL + ALT + left arrow\n if (e.keyCode === 37) {\n e.preventDefault();\n window.dispatchEvent(new Event('trp_trigger_previous_string_event'));\n }\n }\n }\n }, false);\n window.addEventListener('trp_trigger_next_string_event', this.nextString);\n window.addEventListener('trp_trigger_previous_string_event', this.previousString);\n },\n resizeIframe: function resizeIframe(event, ui) {\n var total_width = jQuery(window).width();\n var width = jQuery('#trp-controls').width();\n\n if (width > total_width) {\n width = total_width;\n controls.css('width', width);\n }\n\n var previewContainer = jQuery('#trp-preview');\n previewContainer.css('right', width);\n previewContainer.css('left', width - 348);\n previewContainer.css('width', total_width - width);\n }\n },\n //add support for v-model in select2\n directives: {\n select2: {\n inserted: function inserted(el) {\n jQuery(el).on('select2:select', function () {\n var event = new Event('change', {\n bubbles: true,\n cancelable: true\n });\n el.dispatchEvent(event);\n });\n jQuery(el).on('select2:unselect', function () {\n var event = new Event('change', {\n bubbles: true,\n cancelable: true\n });\n el.dispatchEvent(event);\n });\n }\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vYXNzZXRzL3NyYy9qcy9lZGl0b3IudnVlP2E3NjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLFVBQ0EsY0FEQSxFQUVBLGdCQUZBLEVBR0EsNkJBSEEsRUFJQSxrQkFKQSxFQUtBLG9CQUxBLEVBTUEsZUFOQSxFQU9BLGFBUEEsRUFRQSxrQkFSQSxFQVNBLGlCQVRBLEVBVUEsVUFWQSxFQVdBLGVBWEEsRUFZQSxvQkFaQSxFQWFBLGFBYkEsRUFjQSxnQkFkQSxFQWVBLGNBZkEsRUFnQkEsWUFoQkEsQ0FEQTtBQW1CQTtBQUNBLHlGQURBO0FBRUEsK0ZBRkE7QUFHQSx1RkFIQTtBQUlBO0FBSkEsR0FuQkE7QUF5QkEsTUF6QkEsa0JBeUJBO0FBQ0E7QUFDQTtBQUNBLDZDQUZBO0FBR0Esb0RBSEE7QUFJQSw2RUFKQTtBQUtBLDJDQUxBO0FBTUEsNENBTkE7QUFPQSwyREFQQTtBQVFBLGtEQVJBO0FBU0Esc0RBVEE7QUFVQSw4Q0FWQTtBQVdBLG9EQVhBO0FBWUEsNENBWkE7QUFhQTtBQUNBLDRDQWRBO0FBZUEsK0NBZkE7QUFnQkEsa0NBaEJBO0FBaUJBLGlDQWpCQTtBQWtCQSxnQkFsQkE7QUFtQkEsb0JBbkJBO0FBb0JBLDBCQXBCQTtBQXFCQSw4QkFyQkE7QUFzQkEsK0JBdEJBO0FBdUJBLHNCQXZCQTtBQXdCQSwwQkF4QkE7QUF5QkEsbUJBekJBO0FBMEJBLHNDQTFCQTtBQTJCQSxnQkEzQkE7QUE0QkEsd0JBNUJBO0FBNkJBO0FBN0JBO0FBK0JBLEdBekRBO0FBMERBLFNBMURBLHFCQTBEQTtBQUNBLG1HQURBLENBR0E7O0FBQ0E7QUFFQSxpRUFDQSxvQ0FEQSxLQUdBO0FBQ0EsR0FwRUE7QUFxRUEsU0FyRUEscUJBcUVBO0FBQ0E7QUFDQSxvQkFGQSxDQUdBOztBQUNBO0FBQUE7QUFBQSxPQUpBLENBTUE7O0FBQ0Esa0NBUEEsQ0FTQTs7QUFDQTtBQUNBO0FBQ0EsS0FGQSxFQUVBLEVBRkEsQ0FFQSxlQUZBLEVBRUE7QUFDQTtBQUNBLEtBSkEsRUFJQSxFQUpBLENBSUEsaUJBSkEsRUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FUQSxFQVZBLENBcUJBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQSxPQURBO0FBRUE7QUFBQTtBQUFBLE9BRkE7QUFHQSxrQkFIQTtBQUlBLG1CQUpBO0FBS0E7QUFMQSxPQU1BLElBTkEsQ0FNQSxRQU5BLEVBTUEsaUJBTkEsRUF4QkEsQ0FnQ0E7O0FBQ0E7QUFDQTtBQUNBLEtBRkE7QUFHQSxHQXpHQTtBQTBHQTtBQUNBO0FBQ0Esc0JBREEsQ0FFQTs7QUFDQTtBQUVBO0FBQ0Esb0NBTkEsQ0FRQTs7QUFDQTtBQUNBLHFDQVZBLENBWUE7O0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FOQTtBQU9BO0FBQ0EsS0EzQkE7QUE0QkE7QUFDQTtBQUNBLEtBOUJBO0FBK0JBO0FBQ0EsNENBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BWEEsQ0FhQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0EsS0F0REE7QUF1REE7QUFFQSxtR0FDQTtBQUVBO0FBRUE7QUFFQSwyQkFDQTtBQUVBO0FBQ0Esb0NBYkEsQ0FlQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBLFdBRkE7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBZkE7QUFnQkEsU0FqQkE7QUFrQkEsT0ExQ0EsTUEyQ0E7O0FBRUE7QUFDQTtBQXJIQSxHQTFHQTtBQWlPQTtBQUNBO0FBQ0E7QUFDQTtBQUhBLEdBak9BO0FBc09BO0FBQ0EsZ0JBREEsMEJBQ0E7QUFDQTtBQUNBO0FBRUEsMEZBSkEsQ0FNQTs7QUFDQSw4Q0FDQSxrQ0FSQSxDQVVBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUEsb0ZBakJBLENBbUJBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLE9BUkE7QUFVQSxLQS9CQTtBQWdDQSx3QkFoQ0Esa0NBZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FwQ0E7QUFxQ0EsbUJBckNBLDJCQXFDQSxZQXJDQSxFQXFDQSxRQXJDQSxFQXFDQSxhQXJDQSxFQXFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FOQTtBQVFBO0FBQ0EsT0FaQSxFQVBBLENBcUJBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsK0VBQ0EsSUFEQSxDQUNBO0FBQ0E7QUFDQTtBQUNBLFNBSkEsV0FLQTtBQUNBO0FBQ0EsU0FQQTtBQVFBLE9BaEJBLE1BZ0JBO0FBQ0E7QUFDQTtBQUVBLEtBaEZBO0FBaUZBLG1CQWpGQSwyQkFpRkEsUUFqRkEsRUFpRkEsSUFqRkEsRUFpRkE7QUFDQTs7QUFDQTtBQUNBO0FBQ0EsT0FGQSxNQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0F6RkE7QUEwRkEsc0JBMUZBLDhCQTBGQSxJQTFGQSxFQTBGQTtBQUNBLGdGQUNBO0FBRUE7QUFFQTtBQUNBLEtBakdBO0FBa0dBLG1CQWxHQSwyQkFrR0EsWUFsR0EsRUFrR0E7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSx5R0FDQTtBQUNBOztBQUVBO0FBQ0EsNEJBVkEsQ0FVQTtBQUNBO0FBQ0EsYUFkQTtBQWVBLFdBaEJBO0FBaUJBLFNBbEJBLE1Ba0JBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBLEtBaklBO0FBa0lBLHFCQWxJQSw2QkFrSUEsT0FsSUEsRUFrSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUpBLEVBSkEsQ0FVQTs7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUpBLEVBakJBLENBdUJBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FKQTtBQU1BO0FBQ0EsS0FqS0E7QUFrS0Esa0JBbEtBLDBCQWtLQSxRQWxLQSxFQWtLQSxJQWxLQSxFQWtLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEE7QUFPQTtBQUNBLEtBN0tBO0FBOEtBLGVBOUtBLHVCQThLQSxJQTlLQSxFQThLQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsMEJBREE7QUFFQSw4QkFGQTtBQUdBLDhDQUhBLENBR0E7O0FBSEE7QUFNQSx5QkFDQTtBQUVBLCtCQUNBO0FBRUE7QUFDQTtBQUVBLE9BekJBO0FBMkJBO0FBQ0EsS0EvTUE7QUFnTkEsbUJBaE5BLDZCQWdOQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EsT0FGQTtBQUlBO0FBQ0EsS0F6TkE7QUEwTkEsMEJBMU5BLGtDQTBOQSxnQkExTkEsRUEwTkE7QUFDQTtBQUVBO0FBQ0E7QUFDQSxPQUZBO0FBSUE7QUFDQSxLQWxPQTtBQW1PQSxhQW5PQSxxQkFtT0EsR0FuT0EsRUFtT0E7QUFDQTtBQUNBLEtBck9BO0FBc09BLFlBdE9BLG9CQXNPQSxHQXRPQSxFQXNPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsS0EvT0E7QUFnUEEsY0FoUEEsc0JBZ1BBLE1BaFBBLEVBZ1BBLElBaFBBLEVBZ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EscUhBQ0E7QUFFQSxnSEFDQTtBQUVBLGlDQUNBO0FBRUE7QUFDQSxLQS9QQTtBQWdRQSx1QkFoUUEsaUNBZ1FBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLFdBTEE7QUFLQTtBQUxBLFdBS0EsSUFMQSxDQUtBLFVBTEEsRUFLQSxLQUxBO0FBT0E7QUFDQTtBQUNBLEtBL1FBO0FBZ1JBLDBCQWhSQSxvQ0FnUkE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLEtBbFJBO0FBbVJBLHFCQW5SQSw2QkFtUkEsSUFuUkEsRUFtUkEsSUFuUkEsRUFtUkE7QUFDQSw0QkFDQTtBQUVBO0FBQ0EsS0F4UkE7QUF5UkEseUJBelJBLG1DQXlSQTtBQUNBO0FBQ0EsS0EzUkE7QUE0UkEscUJBNVJBLCtCQTRSQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQ0EsOERBREEsSUFFQSw4SkFGQSxFQUVBO0FBQ0E7QUFDQTtBQUNBLFdBTkE7QUFPQSxTQVJBO0FBU0E7O0FBQ0E7QUFFQTtBQUNBLEtBN1NBO0FBOFNBLGdCQTlTQSx3QkE4U0EsTUE5U0EsRUE4U0E7QUFDQTtBQUVBLDRCQUNBLDhCQURBLEtBRUEsc0JBQ0E7QUFDQSxLQXJUQTtBQXNUQSxrQkF0VEEsNEJBc1RBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQ0E7QUFFQTtBQUNBLEtBblVBO0FBb1VBLGNBcFVBLHdCQW9VQTtBQUNBO0FBQUE7QUFFQSw4QkFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FuVkE7QUFvVkEsZ0NBcFZBLDBDQW9WQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBSEEsTUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FkQSxFQWNBLEtBZEE7QUFnQkE7QUFDQTtBQUNBLEtBdldBO0FBd1dBLGdCQXhXQSx3QkF3V0EsS0F4V0EsRUF3V0EsRUF4V0EsRUF3V0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwWEEsR0F0T0E7QUE0bEJBO0FBQ0E7QUFDQTtBQUNBLGNBREEsb0JBQ0EsRUFEQSxFQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0EsU0FIQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBLFNBSEE7QUFJQTtBQVhBO0FBREE7QUE3bEJBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL2Fzc2V0cy9zcmMvanMvZWRpdG9yLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgICA8ZGl2IGlkPVwidHJwLWVkaXRvclwiPlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidHJwLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnAtY29udHJvbHMtY29udGFpbmVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInRycC1jbG9zZS1zYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJ0cnAtY29udHJvbHMtY2xvc2VcIiA6aHJlZj1cImNsb3NlVVJMXCIgOnRpdGxlPVwiZWRpdG9yU3RyaW5ncy5jbG9zZVwiPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLXNhdmUtYW5kLWxvYWRlci1zcGlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJwLWFqYXgtbG9hZGVyXCIgdi1zaG93PVwibG9hZGluZ19zdHJpbmdzID4gMFwiIGlkPVwidHJwLXN0cmluZy1zYXZlZC1hamF4LWxvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNhdmUtdHJhbnNsYXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkSW5kZXhlc0FycmF5PVwic2VsZWN0ZWRJbmRleGVzQXJyYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkaWN0aW9uYXJ5PVwiZGljdGlvbmFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNldHRpbmdzPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpub25jZXM9XCJub25jZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDphamF4X3VybD1cImFqYXhfdXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y3VycmVudExhbmd1YWdlPVwiY3VycmVudExhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b25TY3JlZW5MYW5ndWFnZT1cIm9uU2NyZWVuTGFuZ3VhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppZnJhbWU9XCJpZnJhbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjdXJyZW50VVJMPVwiY3VycmVudFVSTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lcmdpbmdTdHJpbmc9XCJtZXJnaW5nU3RyaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVyZ2VEYXRhPVwibWVyZ2VEYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHJhbnNsYXRpb25zLXNhdmVkPVwic2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZWRpdG9yU3RyaW5ncz1cImVkaXRvclN0cmluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2F2ZS10cmFuc2xhdGlvbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1jb250cm9scy1zZWN0aW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInRycC1sYW5ndWFnZS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJ0cnAtbGFuZ3VhZ2Utc2VsZWN0XCIgbmFtZT1cImxhbmdcIiB2LW1vZGVsPVwiY3VycmVudExhbmd1YWdlXCIgdi1zZWxlY3QyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCIobGFuZywgbGFuZ0luZGV4KSBpbiBsYW5ndWFnZU5hbWVzXCIgOnZhbHVlPVwibGFuZ0luZGV4XCI+e3tsYW5nfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtc3RyaW5nLWxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJ0cnAtc3RyaW5nLWNhdGVnb3JpZXNcIiB2LW1vZGVsPVwic2VsZWN0ZWRTdHJpbmdcIiB2LXNlbGVjdDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIHYtZm9yPVwiKGdyb3VwKSBpbiBzdHJpbmdHcm91cHNcIiA6bGFiZWw9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwiKHN0cmluZywgaW5kZXgpIGluIGRpY3Rpb25hcnlcIiA6dmFsdWU9XCJpbmRleFwiIHYtaWY9XCJzaG93U3RyaW5nKCBzdHJpbmcsIGdyb3VwIClcIiA6dGl0bGU9XCJzdHJpbmcuZGVzY3JpcHRpb25cIiA6ZGF0YS1kYXRhYmFzZS1pZD1cInN0cmluZy5kYklEXCIgOmRhdGEtZ3JvdXA9XCJzdHJpbmcuZ3JvdXBcIj57eyBwcm9jZXNzT3B0aW9uTmFtZSggc3RyaW5nLm9yaWdpbmFsLCBncm91cCApIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtbmV4dC1wcmV2aW91c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJ0cnAtcHJldmlvdXNcIiBjbGFzcz1cInRycC1uZXh0LXByZXZpb3VzLWJ1dHRvbnNcIiB2LW9uOmNsaWNrPVwicHJldmlvdXNTdHJpbmcoKVwiIDp0aXRsZT1cImVkaXRvclN0cmluZ3MucHJldmlvdXNfdGl0bGVfYXR0clwiPjxzcGFuPiZsYXF1bzs8L3NwYW4+IHt7IGVkaXRvclN0cmluZ3MucHJldmlvdXMgfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwidHJwLW5leHRcIiBjbGFzcz1cInRycC1uZXh0LXByZXZpb3VzLWJ1dHRvbnNcIiB2LW9uOmNsaWNrPVwibmV4dFN0cmluZygpXCIgOnRpdGxlPVwiZWRpdG9yU3RyaW5ncy5uZXh0X3RpdGxlX2F0dHJcIj57eyBlZGl0b3JTdHJpbmdzLm5leHQgfX0gPHNwYW4+JnJhcXVvOzwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLXZpZXctYXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtdmlldy1hcy1kZXNjcmlwdGlvblwiPnt7IGVkaXRvclN0cmluZ3Mudmlld19hcyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInRycC12aWV3LWFzLXNlbGVjdFwiIHYtbW9kZWw9XCJ2aWV3QXNcIiB2LXNlbGVjdDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIihyb2xlLCByb2xlSW5kZXgpIGluIHJvbGVzXCIgOnZhbHVlPVwicm9sZVwiIDpkaXNhYmxlZD1cIiFyb2xlXCIgOnRpdGxlPVwiIXJvbGUgPyBlZGl0b3JTdHJpbmdzLnZpZXdfYXNfcHJvIDogJydcIj57e3JvbGVJbmRleH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1jb250cm9scy1zZWN0aW9uXCIgdi1zaG93PVwic2VsZWN0ZWRTdHJpbmcgIT09IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFuZ3VhZ2UtYm94ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzZWxlY3RlZEluZGV4ZXNBcnJheT1cInNlbGVjdGVkSW5kZXhlc0FycmF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkaWN0aW9uYXJ5PVwiZGljdGlvbmFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y3VycmVudExhbmd1YWdlPVwiY3VycmVudExhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvblNjcmVlbkxhbmd1YWdlPVwib25TY3JlZW5MYW5ndWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bGFuZ3VhZ2VOYW1lcz1cImxhbmd1YWdlTmFtZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNldHRpbmdzPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2U9XCJzaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkaXNjYXJkZWQtY2hhbmdlcz1cImhhc1Vuc2F2ZWRDaGFuZ2VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVkaXRvclN0cmluZ3M9XCJlZGl0b3JTdHJpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmbGFnc1BhdGg9XCJmbGFnc1BhdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlmcmFtZT1cImlmcmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFuZ3VhZ2UtYm94ZXM+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZXh0cmEtY29udGVudCA6bGFuZ3VhZ2VOYW1lcz1cImxhbmd1YWdlTmFtZXNcIiA6ZWRpdG9yU3RyaW5ncz1cImVkaXRvclN0cmluZ3NcIiA6cGFpZFZlcnNpb249XCJwYWlkX3ZlcnNpb25cIj48L2V4dHJhLWNvbnRlbnQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRycC1jb250cm9scy1zZWN0aW9uXCIgdi1zaG93PVwidHJhbnNsYXRpb25Ob3RMb2FkZWRZZXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidHJwLXRyYW5zbGF0aW9uLW5vdC1yZWFkeS1zZWN0aW9uXCIgY2xhc3M9XCJ0cnAtY29udHJvbHMtc2VjdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIHYtaHRtbD1cImVkaXRvclN0cmluZ3MudHJhbnNsYXRpb25fbm90X2xvYWRlZF95ZXRcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwidHJwX3NlbGVjdDJfb3ZlcmxheVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGhvdmVyLWFjdGlvbnNcclxuICAgICAgICAgICAgICAgIHJlZj1cImhvdmVyQWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICA6ZGljdGlvbmFyeT1cImRpY3Rpb25hcnlcIlxyXG4gICAgICAgICAgICAgICAgOnNldHRpbmdzPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgOmlmcmFtZT1cImlmcmFtZVwiXHJcbiAgICAgICAgICAgICAgICA6ZGF0YUF0dHJpYnV0ZXM9XCJkYXRhQXR0cmlidXRlc1wiXHJcbiAgICAgICAgICAgICAgICA6bWVyZ2VSdWxlcz1cIm1lcmdlUnVsZXNcIlxyXG4gICAgICAgICAgICAgICAgOm5vbmNlcz1cIm5vbmNlc1wiXHJcbiAgICAgICAgICAgICAgICA6YWpheF91cmw9XCJhamF4X3VybFwiXHJcbiAgICAgICAgICAgICAgICA6bWVyZ2VEYXRhPVwibWVyZ2VEYXRhXCJcclxuICAgICAgICAgICAgICAgIDplZGl0b3JTdHJpbmdzPVwiZWRpdG9yU3RyaW5nc1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9ob3Zlci1hY3Rpb25zPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidHJwLXByZXZpZXdcIj5cclxuICAgICAgICAgICAgPGlmcmFtZSBpZD1cInRycC1wcmV2aWV3LWlmcmFtZVwiIDpzcmM9XCJ1cmxUb0xvYWRcIiB2LW9uOmxvYWQ9XCJpRnJhbWVMb2FkZWRcIj48L2lmcmFtZT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ0cnAtcHJldmlldy1sb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ0cnAtbG9hZGVyXCIgd2lkdGg9XCI2NXB4XCIgaGVpZ2h0PVwiNjVweFwiIHZpZXdCb3g9XCIwIDAgNjYgNjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInRycC1jaXJjbGVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgY3g9XCIzM1wiIGN5PVwiMzNcIiByPVwiMzBcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdD5cclxuICAgIGltcG9ydCAnc2VsZWN0Mi9kaXN0L2pzL3NlbGVjdDIubWluLmpzJ1xyXG4gICAgaW1wb3J0IHV0aWxzICAgICAgICAgICAgZnJvbSAnLi91dGlscydcclxuICAgIGltcG9ydCBheGlvcyAgICAgICAgICAgIGZyb20gJ2F4aW9zJ1xyXG4gICAgaW1wb3J0IGxhbmd1YWdlQm94ZXMgICAgZnJvbSAnLi9jb21wb25lbnRzL2xhbmd1YWdlLWJveGVzLnZ1ZSdcclxuICAgIGltcG9ydCBzYXZlVHJhbnNsYXRpb25zIGZyb20gJy4vY29tcG9uZW50cy9zYXZlLXRyYW5zbGF0aW9ucy52dWUnXHJcbiAgICBpbXBvcnQgaG92ZXJBY3Rpb25zICAgICBmcm9tICcuL2NvbXBvbmVudHMvaG92ZXItYWN0aW9ucy52dWUnXHJcbiAgICBpbXBvcnQgZXh0cmFDb250ZW50ICAgICBmcm9tICcuL2NvbXBvbmVudHMvZXh0cmEtY29udGVudC52dWUnXHJcbiAgICBpbXBvcnQgaGUgICAgICAgICAgICAgICBmcm9tICdoZSdcclxuXHJcbiAgICBleHBvcnQgZGVmYXVsdCB7XHJcbiAgICAgICAgcHJvcHM6IFtcclxuICAgICAgICAgICAgJ3RycF9zZXR0aW5ncycsXHJcbiAgICAgICAgICAgICdsYW5ndWFnZV9uYW1lcycsXHJcbiAgICAgICAgICAgICdvcmRlcmVkX3NlY29uZGFyeV9sYW5ndWFnZXMnLFxyXG4gICAgICAgICAgICAnY3VycmVudF9sYW5ndWFnZScsXHJcbiAgICAgICAgICAgICdvbl9zY3JlZW5fbGFuZ3VhZ2UnLFxyXG4gICAgICAgICAgICAndmlld19hc19yb2xlcycsXHJcbiAgICAgICAgICAgICd1cmxfdG9fbG9hZCcsXHJcbiAgICAgICAgICAgICdzdHJpbmdfc2VsZWN0b3JzJyxcclxuICAgICAgICAgICAgJ2RhdGFfYXR0cmlidXRlcycsXHJcbiAgICAgICAgICAgICdhamF4X3VybCcsXHJcbiAgICAgICAgICAgICdlZGl0b3Jfbm9uY2VzJyxcclxuICAgICAgICAgICAgJ3N0cmluZ19ncm91cF9vcmRlcicsXHJcbiAgICAgICAgICAgICdtZXJnZV9ydWxlcycsXHJcbiAgICAgICAgICAgICdsb2NhbGl6ZWRfdGV4dCcsXHJcbiAgICAgICAgICAgICdwYWlkX3ZlcnNpb24nLFxyXG4gICAgICAgICAgICAnZmxhZ3NfcGF0aCdcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvbXBvbmVudHM6e1xyXG4gICAgICAgICAgICBsYW5ndWFnZUJveGVzLFxyXG4gICAgICAgICAgICBzYXZlVHJhbnNsYXRpb25zLFxyXG4gICAgICAgICAgICBob3ZlckFjdGlvbnMsXHJcbiAgICAgICAgICAgIGV4dHJhQ29udGVudFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGF0YSgpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLy9wcm9wc1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MgICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoIHRoaXMudHJwX3NldHRpbmdzICksXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZU5hbWVzICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5sYW5ndWFnZV9uYW1lcyApLFxyXG4gICAgICAgICAgICAgICAgb3JkZXJlZFNlY29uZGFyeUxhbmd1YWdlcyA6IEpTT04ucGFyc2UoIHRoaXMub3JkZXJlZF9zZWNvbmRhcnlfbGFuZ3VhZ2VzICksXHJcbiAgICAgICAgICAgICAgICByb2xlcyAgICAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy52aWV3X2FzX3JvbGVzICksXHJcbiAgICAgICAgICAgICAgICBub25jZXMgICAgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5lZGl0b3Jfbm9uY2VzKSxcclxuICAgICAgICAgICAgICAgIHN0cmluZ0dyb3VwT3JkZXIgICAgICAgICAgOiBKU09OLnBhcnNlKCB0aGlzLnN0cmluZ19ncm91cF9vcmRlciksXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcnMgICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5zdHJpbmdfc2VsZWN0b3JzICksXHJcbiAgICAgICAgICAgICAgICBkYXRhQXR0cmlidXRlcyAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5kYXRhX2F0dHJpYnV0ZXMgKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlUnVsZXMgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKCB0aGlzLm1lcmdlX3J1bGVzICksXHJcbiAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzICAgICAgICAgICAgIDogSlNPTi5wYXJzZSggdGhpcy5sb2NhbGl6ZWRfdGV4dCApLFxyXG4gICAgICAgICAgICAgICAgZmxhZ3NQYXRoICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoIHRoaXMuZmxhZ3NfcGF0aCApLFxyXG4gICAgICAgICAgICAgICAgLy9kYXRhXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2UgICAgICAgICAgIDogdGhpcy5jdXJyZW50X2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgb25TY3JlZW5MYW5ndWFnZSAgICAgICAgICA6IHRoaXMub25fc2NyZWVuX2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFVSTCAgICAgICAgICAgICAgICA6IHRoaXMudXJsX3RvX2xvYWQsXHJcbiAgICAgICAgICAgICAgICB1cmxUb0xvYWQgICAgICAgICAgICAgICAgIDogdGhpcy51cmxfdG9fbG9hZCxcclxuICAgICAgICAgICAgICAgIGlmcmFtZSAgICAgICAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RyaW5nICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleGVzQXJyYXkgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgZGV0ZWN0ZWRTZWxlY3RvckFuZElkICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgc3RyaW5nR3JvdXBzICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2luZ1N0cmluZyAgICAgICAgICAgICA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VEYXRhICAgICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NoYW5nZXNVbnNhdmVkTWVzc2FnZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmlld0FzICAgICAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZ19zdHJpbmdzICAgICAgICAgICA6IDAsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk5vdExvYWRlZFlldCAgIDogZmFsc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNyZWF0ZWQoKXtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZS1uYW1lJ10gPSB0aGlzLmxhbmd1YWdlTmFtZXNbIHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXSBdXHJcblxyXG4gICAgICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgVmlldyBBcyBzZWxlY3RcclxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHV0aWxzLmdldFVybFBhcmFtZXRlcnMoIHRoaXMuY3VycmVudFVSTCApXHJcblxyXG4gICAgICAgICAgICBpZiggT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPiAxICYmIHBhcmFtc1sndHJwLXZpZXctYXMnXSApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdBcyA9IHBhcmFtc1sndHJwLXZpZXctYXMnXVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdBcyA9ICdjdXJyZW50X3VzZXInXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtb3VudGVkKCl7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5Ym9hcmRTaG9ydGN1dHNMaXN0ZW5lcigpXHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIHNlbGVjdDJcclxuICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1sYW5ndWFnZS1zZWxlY3QsICN0cnAtdmlldy1hcy1zZWxlY3QnICkuc2VsZWN0MiggeyB3aWR0aCA6ICcxMDAlJyB9KVxyXG5cclxuICAgICAgICAgICAgLy9pbml0IHN0cmluZ3MgZHJvcGRvd25cclxuICAgICAgICAgICAgdGhpcy5zdHJpbmdzRHJvcGRvd25Mb2FkaW5nKClcclxuXHJcbiAgICAgICAgICAgIC8vIHNob3cgb3ZlcmxheSB3aGVuIHNlbGVjdCBpcyBvcGVuZWRcclxuICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1sYW5ndWFnZS1zZWxlY3QsICN0cnAtc3RyaW5nLWNhdGVnb3JpZXMnICkub24oICdzZWxlY3QyOm9wZW4nLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmZhZGVJbiggJzEwMCcgKVxyXG4gICAgICAgICAgICB9KS5vbiggJ3NlbGVjdDI6Y2xvc2UnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmhpZGUoKVxyXG4gICAgICAgICAgICB9KS5vbiggJ3NlbGVjdDI6b3BlbmluZycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8qIHdoZW4gd2UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgcHJldmVudCB0aGUgc3RyaW5ncyBkcm9wZG93biBmcm9tIG9wZW5pbmcgc28gd2UgZG8gbm90IGhhdmUgYSBkaXNjb25uZWN0IGJldHdlZW4gdGhlIHRleHRhcmVhcyBhbmQgdGhlIGRyb3Bkb3duICovXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvLyByZXNpemUgc2lkZWJhciBhbmQgY29uc2VxdWVudGx5IHRoZSBpZnJhbWVcclxuICAgICAgICAgICAgbGV0IHByZXZpZXdDb250YWluZXIgPSBqUXVlcnkoICcjdHJwLXByZXZpZXcnICk7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbF93aWR0aCA9IGpRdWVyeSh3aW5kb3cpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGpRdWVyeSggJyN0cnAtY29udHJvbHMnICkucmVzaXphYmxlKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiggKSB7IHByZXZpZXdDb250YWluZXIudG9nZ2xlKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiggKSB7IHByZXZpZXdDb250YWluZXIudG9nZ2xlKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVzOiAnZScsXHJcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjg1LFxyXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRvdGFsX3dpZHRoIC0gMjBcclxuICAgICAgICAgICAgfSkuYmluZCggXCJyZXNpemVcIiwgdGhpcy5yZXNpemVJZnJhbWUgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2l6ZSBpZnJhbWUgd2hlbiByZXNpemluZyB3aW5kb3dcclxuICAgICAgICAgICAgalF1ZXJ5KCB3aW5kb3cgKS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yZXNpemVJZnJhbWUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3YXRjaDoge1xyXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2U6IGZ1bmN0aW9uKCBjdXJyZW50TGFuZ3VhZ2UgKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIC8vZ3JhYiB0aGUgY29ycmVjdCBVUkwgZnJvbSB0aGUgaUZyYW1lXHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3VVJMID0gdGhpcy5pZnJhbWUucXVlcnlTZWxlY3RvciggJ2xpbmtbaHJlZmxhbmc9XCInICsgY3VycmVudExhbmd1YWdlLnJlcGxhY2UoICdfJywgJy0nICkgKydcIl0nICkuZ2V0QXR0cmlidXRlKCdocmVmJylcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVUkwgICAgICAgICAgID0gbmV3VVJMXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZS5sb2NhdGlvbiAgICAgID0gbmV3VVJMXHJcblxyXG4gICAgICAgICAgICAgICAgLy9yZXNldCB2dWUgcHJvcHNcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdHJpbmcgICAgICAgPSAnJ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgLy9zZXQgc3RyaW5ncyBkcm9wZG93biB0byBsb2FkaW5nIHN0YXRlXHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJyN0cnAtc3RyaW5nLWNhdGVnb3JpZXMnKS52YWwoJycpLnRyaWdnZXIoJ2NoYW5nZScpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZ3NEcm9wZG93bkxvYWRpbmcoKVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25TY3JlZW5MYW5ndWFnZSA9IGN1cnJlbnRMYW5ndWFnZVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3NbJ2RlZmF1bHQtbGFuZ3VhZ2UnXSA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSAmJiB0aGlzLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5sZW5ndGggPiAxICl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1sndHJhbnNsYXRpb24tbGFuZ3VhZ2VzJ10uc29tZShmdW5jdGlvbihsYW5ndWFnZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGFuZ3VhZ2UgIT0gc2VsZi5zZXR0aW5nc1snZGVmYXVsdC1sYW5ndWFnZSddICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIG5vdCBkZWZhdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uU2NyZWVuTGFuZ3VhZ2UgPSBsYW5ndWFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGN1cnJlbnRVUkw6IGZ1bmN0aW9uICggbmV3VXJsLCBvbGRVcmwgKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG51bGwsIG51bGwsIHRoaXMucGFyZW50VVJMKCBuZXdVcmwgKSApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHZpZXdBczogZnVuY3Rpb24oIHJvbGUgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiggIXRoaXMuY3VycmVudFVSTCB8fCAhdGhpcy5pZnJhbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmNsZWFuVVJMKCB0aGlzLmN1cnJlbnRVUkwgKVxyXG5cclxuICAgICAgICAgICAgICAgIHVybCA9IHV0aWxzLnVwZGF0ZVVybFBhcmFtZXRlciggdXJsLCAndHJwLWVkaXQtdHJhbnNsYXRpb24nLCAncHJldmlldycgKVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCByb2xlID09ICdjdXJyZW50X3VzZXInICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLmxvY2F0aW9uID0gdXJsXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9pZiBub25jZSBub3QgYXZhaWxhYmxlLCBhbiB1cGRhdGUgdG8gdGhlIEJyb3dzZSBhcyBPdGhlciBSb2xlcyBhZGQtb24gaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIGlmKCAhdGhpcy5ub25jZXNbcm9sZV0gKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoIHRoaXMuZWRpdG9yU3RyaW5ncy5ib3JfdXBkYXRlX25vdGljZSApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMudXBkYXRlVXJsUGFyYW1ldGVyKCB1cmwsICd0cnAtdmlldy1hcycsIHJvbGUgKVxyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMudXBkYXRlVXJsUGFyYW1ldGVyKCB1cmwsICd0cnAtdmlldy1hcy1ub25jZScsIHRoaXMubm9uY2VzW3JvbGVdIClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZS5sb2NhdGlvbiA9IHVybFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZWxlY3RlZFN0cmluZzogZnVuY3Rpb24gKCBzZWxlY3RlZFN0cmluZ0FycmF5SW5kZXgsIG9sZFN0cmluZyApe1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzKCkgfHwgKCAhc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4ICYmIHNlbGVjdGVkU3RyaW5nQXJyYXlJbmRleCAhPT0gMCApIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnZhbCggc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4ICE9PSBudWxsID8gc2VsZWN0ZWRTdHJpbmdBcnJheUluZGV4IDogJycgKS50cmlnZ2VyKCAnY2hhbmdlJyApXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU3RyaW5nICAgICAgID0gdGhpcy5kaWN0aW9uYXJ5W3NlbGVjdGVkU3RyaW5nQXJyYXlJbmRleF1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggIXNlbGVjdGVkU3RyaW5nIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgICAgICAgICAgPSB0aGlzLmlmcmFtZS5xdWVyeVNlbGVjdG9yKCBcIltcIiArIHNlbGVjdGVkU3RyaW5nLnNlbGVjdG9yICsgXCI9J1wiICsgc2VsZWN0ZWRTdHJpbmcuZGJJRCArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEluZGV4ZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgLy93aGVuIG1lcmdpbmcgd2UgZG8gbm90IGhhdmUgYSB2YWxpZCBjdXJyZW50IG5vZGUsIHNvIHdlIGp1c3QgYWRkIHRoZSBmYWtlIGlkXHJcbiAgICAgICAgICAgICAgICBpZiggY3VycmVudE5vZGUgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdG9ycyA9IHNlbGYuZ2V0QWxsU2VsZWN0b3JzKClcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZXMgPSBbXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKCBjdXJyZW50Tm9kZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVudE5vZGUudGFnTmFtZSAhPSBcIkFcIiApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBhbmNob3IncyB0cmFuc2xhdGFibGUgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yUGFyZW50ICA9IGN1cnJlbnROb2RlLmNsb3Nlc3QoJ2EnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggIGFuY2hvclBhcmVudCAhPSBudWxsICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChhbmNob3JQYXJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVudE5vZGUudGFnTmFtZSA9PSBcIkFcIiAmJiBjdXJyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgYWxsIHRoZSB0cmFuc2xhdGFibGUgYXR0cmlidXRlcyBpbnNpZGUgdGhlIGFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5BcnJheSA9IFsgLi4uY3VycmVudE5vZGUuY2hpbGRyZW4gXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5BcnJheS5mb3JFYWNoKCBmdW5jdGlvbiAoIGNoaWxkICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChjaGlsZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCBmdW5jdGlvbiggbm9kZSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyaW5nSWQgPSBub2RlLmdldEF0dHJpYnV0ZShzZWxlY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VsZWN0ZWRJbmRleGVzQXJyYXkubGVuZ3RoOyBpKysgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhlc0FycmF5W2ldXSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhlc0FycmF5W2ldXS5kYklEICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleGVzQXJyYXlbaV1dLmRiSUQgPT09IHN0cmluZ0lkICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBmb3VuZCApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleGVzQXJyYXkucHVzaChzZWxmLmdldFN0cmluZ0luZGV4KHNlbGVjdG9yLCBzdHJpbmdJZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheS5wdXNoKCBzZWxlY3RlZFN0cmluZ0FycmF5SW5kZXggKVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkgPSBzZWxlY3RlZEluZGV4ZXNBcnJheVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICAgICAgY2xvc2VVUkw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW5VUkwoIHRoaXMuY3VycmVudFVSTCApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG1ldGhvZHM6IHtcclxuICAgICAgICAgICAgaUZyYW1lTG9hZGVkKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RycC1wcmV2aWV3LWlmcmFtZScpXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZnJhbWUgPSBpZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnRcclxuXHJcbiAgICAgICAgICAgICAgICAvL3N5bmMgaUZyYW1lIFVSTCB3aXRoIHBhcmVudFxyXG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLmN1cnJlbnRVUkwgIT0gdGhpcy5pZnJhbWUuVVJMIClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVUkwgPSB0aGlzLmlmcmFtZS5VUkxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2hpZGUgaUZyYW1lIGxvYWRlclxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZnJhbWVMb2FkZXIoICdoaWRlJyApXHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZi5kZXRlY3RlZFNlbGVjdG9yQW5kSWQgPSBbXVxyXG4gICAgICAgICAgICAgICAgc2VsZi5kaWN0aW9uYXJ5ICAgICAgICAgICAgPSBbXVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FuSWZyYW1lRm9yU3RyaW5ncygpXHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0cnBfaWZyYW1lX3BhZ2VfdXBkYXRlZCcsIHRoaXMuc2NhbklmcmFtZUZvclN0cmluZ3MgKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBpRnJhbWUgaXMgbmF2aWdhdGVkXHJcbiAgICAgICAgICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmlmcmFtZUxvYWRlciggJ3Nob3cnIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZFN0cmluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkSW5kZXhlc0FycmF5ID0gW11cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYW5zbGF0aW9uTm90TG9hZGVkWWV0ID0gZmFsc2VcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdzRHJvcGRvd25Mb2FkaW5nKClcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNjYW5JZnJhbWVGb3JTdHJpbmdzKCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5Gb3JTZWxlY3RvciggJ2RhdGEtdHJwLXRyYW5zbGF0ZS1pZCcsICdyZWd1bGFyJywgdGhpcy5vblNjcmVlbkxhbmd1YWdlIClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbkZvclNlbGVjdG9yKCAnZGF0YS10cnBnZXR0ZXh0b3JpZ2luYWwnLCAnZ2V0dGV4dCcsIHRoaXMuY3VycmVudExhbmd1YWdlIClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbkZvclNlbGVjdG9yKCAnZGF0YS10cnAtcG9zdC1zbHVnJywgJ3Bvc3RzbHVnJywgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzY2FuRm9yU2VsZWN0b3IoIGJhc2VTZWxlY3RvciwgdHlwZVNsdWcsIGxhbmd1YWdlT2ZJZHMgKXtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ19zdHJpbmdzKytcclxuICAgICAgICAgICAgICAgIGxldCBzZWxmICAgICAgICAgICA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvcnMgICAgICA9IHRoaXMucHJlcGFyZVNlbGVjdG9yU3RyaW5ncyggYmFzZVNlbGVjdG9yIClcclxuICAgICAgICAgICAgICAgIGxldCBub2RlcyAgICAgICAgICA9IFsuLi50aGlzLmlmcmFtZS5xdWVyeVNlbGVjdG9yQWxsKCAnWycgKyBzZWxlY3RvcnMuam9pbignXSxbJykgKyAnXScgKV1cclxuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdJZHNBcnJheSA9IFtdLCBub2RlRGF0YSA9IFtdLCBub2RlRW50cmllcyA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCggZnVuY3Rpb24gKCBub2RlICl7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZUVudHJpZXMgPSBzZWxmLmdldE5vZGVJbmZvKCBub2RlLCBiYXNlU2VsZWN0b3IgKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2RlRW50cmllcy5mb3JFYWNoKCBmdW5jdGlvbiggZW50cnkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgZW5zdXJlcyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBkdXBsaWNhdGVzIHdoZW4gcmVzY2FubmluZyBhZnRlciBhamF4IGNvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIXNlbGYuYWxyZWFkeURldGVjdGVkKCBlbnRyeS5zZWxlY3RvciwgZW50cnkuZGJJRCApICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSWRzQXJyYXkucHVzaChlbnRyeS5kYklEKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZURhdGEucHVzaChlbnRyeSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBFdmVudExpc3RlbmVyKCBub2RlIClcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgLy91bmlxdWUgaWRzIG9ubHlcclxuICAgICAgICAgICAgICAgIHN0cmluZ0lkc0FycmF5ID0gWy4uLm5ldyBTZXQoc3RyaW5nSWRzQXJyYXkpXVxyXG4gICAgICAgICAgICAgICAgaWYgKCBzdHJpbmdJZHNBcnJheS5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKClcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCgnYWN0aW9uJyAgICAgICAsICd0cnBfZ2V0X3RyYW5zbGF0aW9uc18nICsgdHlwZVNsdWcpXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ2FsbF9sYW5ndWFnZXMnLCAndHJ1ZScpXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ3NlY3VyaXR5JyAgICAgLCB0aGlzLm5vbmNlc1snZ2V0dHJhbnNsYXRpb25zbm9uY2UnICsgdHlwZVNsdWddKVxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdsYW5ndWFnZScgICAgICwgbGFuZ3VhZ2VPZklkcylcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCgnc3RyaW5nX2lkcycgICAsIEpTT04uc3RyaW5naWZ5KHN0cmluZ0lkc0FycmF5KSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXhpb3MucG9zdCh0aGlzLmFqYXhfdXJsLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZGluZ19zdHJpbmdzLS1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkVG9EaWN0aW9uYXJ5KHJlc3BvbnNlLmRhdGEsIG5vZGVEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkaW5nX3N0cmluZ3MtLVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWxyZWFkeURldGVjdGVkKCBzZWxlY3RvciwgZGJJZCApe1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbWJpbmVkID0gc2VsZWN0b3IgKyAnPScgKyBkYklkXHJcbiAgICAgICAgICAgICAgICBpZiAoIHV0aWxzLmFycmF5Q29udGFpbnNJdGVtKCB0aGlzLmRldGVjdGVkU2VsZWN0b3JBbmRJZCwgY29tYmluZWQgKSApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRTZWxlY3RvckFuZElkLnB1c2goY29tYmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lciggbm9kZSApe1xyXG4gICAgICAgICAgICAgICAgaWYgKCBub2RlLnRhZ05hbWUgPT0gJ0EnICYmICFub2RlLmhhc0F0dHJpYnV0ZSggJ2RhdGEtdHJwZ2V0dGV4dG9yaWdpbmFsJyApIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgc2VsZi4kcmVmcy5ob3ZlckFjdGlvbnMuc2hvd1BlbmNpbEljb24gKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhZGRUb0RpY3Rpb25hcnkoIHJlc3BvbnNlRGF0YSwgbm9kZUluZm8gPSBudWxsICl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHJlc3BvbnNlRGF0YSAhPSBudWxsICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICggbm9kZUluZm8gKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uZm9yRWFjaChmdW5jdGlvbiAoIGluZm9Sb3csIGluZGV4ICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuc29tZSggZnVuY3Rpb24gKCByZXNwb25zZURhdGFSb3cgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mb1Jvdy5kYklEID09IHJlc3BvbnNlRGF0YVJvdy5kYklEICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JyaW5nIGJsb2NrX3R5cGUgdG8gdGhlIHRvcCBsZXZlbCBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXNwb25zZURhdGFSb3cudHlwZSAhPSAnZ2V0dGV4dCcgJiYgdHlwZW9mIHJlc3BvbnNlRGF0YVJvdy5ibG9ja190eXBlID09ICd1bmRlZmluZWQnICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0TGFuZ3VhZ2UgPSBzZWxmLm9yZGVyZWRTZWNvbmRhcnlMYW5ndWFnZXNbMF1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiByZXNwb25zZURhdGFSb3cudHJhbnNsYXRpb25zQXJyYXlbZmlyc3RMYW5ndWFnZV0uYmxvY2tfdHlwZSAhPSAndW5kZWZpbmVkJyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhUm93LmJsb2NrX3R5cGUgPSByZXNwb25zZURhdGFSb3cudHJhbnNsYXRpb25zQXJyYXlbZmlyc3RMYW5ndWFnZV0uYmxvY2tfdHlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5mb1tpbmRleF0gPSBPYmplY3QuYXNzaWduKCB7fSwgcmVzcG9uc2VEYXRhUm93LCBpbmZvUm93IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUgLy8gYSBzb3J0IG9mIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8gPSByZXNwb25zZURhdGFcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nR3JvdXBzID0gdGhpcy5hZGRUb1N0cmluZ0dyb3Vwcyggbm9kZUluZm8gKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeS5jb25jYXQoIG5vZGVJbmZvIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3RyaW5nc0Ryb3Bkb3duKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkVG9TdHJpbmdHcm91cHMoIHN0cmluZ3MgKXtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZWUgd2hhdCBub2RlIGdyb3VwcyBhcmUgZm91bmRcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZFN0cmluZ0dyb3VwcyA9IHRoaXMuc3RyaW5nR3JvdXBzO1xyXG4gICAgICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKCBmdW5jdGlvbiAoIHN0cmluZyApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIGZvdW5kU3RyaW5nR3JvdXBzLmluZGV4T2YoIHN0cmluZy5ncm91cCApID09PSAtMSAmJiAoICggdHlwZW9mIHN0cmluZy5ibG9ja1R5cGUgPT09ICd1bmRlZmluZWQnICkgfHwgc3RyaW5nLmJsb2NrVHlwZSAhPT0gJzInICkgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdHJpbmdHcm91cHMucHVzaCggc3RyaW5nLmdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgbm9kZSBncm91cHMgaW4gdGhlIG9yZGVyIHRoYXQgd2Ugd2FudCwgYWNjb3JkaW5nIHRvIHRoZSBwcm9wIHRoaXMuc3RyaW5nR3JvdXBPcmRlclxyXG4gICAgICAgICAgICAgICAgbGV0IG9yZGVyZWRTdHJpbmdHcm91cHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuZWRpdG9yU3RyaW5ncy5zZW9fdXBkYXRlX25vdGljZSAhPSAnc2VvX3BhY2tfdXBkYXRlX25vdF9uZWVkZWQnICl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJlZFN0cmluZ0dyb3Vwcy5wdXNoKCB0aGlzLmVkaXRvclN0cmluZ3Muc2VvX3VwZGF0ZV9ub3RpY2UgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZ0dyb3VwT3JkZXIuZm9yRWFjaCggZnVuY3Rpb24oIGdyb3VwICl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBmb3VuZFN0cmluZ0dyb3Vwcy5pbmRleE9mKCBncm91cCApICE9PSAtMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkU3RyaW5nR3JvdXBzLnB1c2goIGdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIHN0cmluZyBncm91cHMgdGhhdCB3ZXJlIG5vdCBpbiB0aGUgcHJvcCwgYWRkIHRoZW0gYXQgdGhlIGVuZC5cclxuICAgICAgICAgICAgICAgIGZvdW5kU3RyaW5nR3JvdXBzLmZvckVhY2goIGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICggb3JkZXJlZFN0cmluZ0dyb3Vwcy5pbmRleE9mKCBncm91cCApID09PSAtMSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkU3RyaW5nR3JvdXBzLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRTdHJpbmdHcm91cHM7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldFN0cmluZ0luZGV4KCBzZWxlY3RvciwgZGJJRCApe1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5zb21lKGZ1bmN0aW9uICggc3RyaW5nLCBpbmRleCApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIHN0cmluZy5kYklEID09IGRiSUQgJiYgc3RyaW5nLnNlbGVjdG9yID09IHNlbGVjdG9yICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaW5kZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXROb2RlSW5mbyggbm9kZSwgYmFzZVNlbGVjdG9yID0gJycgKXtcclxuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdJZFxyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVEYXRhICA9IFtdXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0b3JzID0gdGhpcy5wcmVwYXJlU2VsZWN0b3JTdHJpbmdzKCBiYXNlU2VsZWN0b3IgKVxyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5mb3JFYWNoKCBmdW5jdGlvbiAoIHNlbGVjdG9yICkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdJZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCBzZWxlY3RvciApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggc3RyaW5nSWQgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZUF0dHJpYnV0ZSAgID0gc2VsZWN0b3IucmVwbGFjZSggYmFzZVNlbGVjdG9yLCAnJyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlR3JvdXAgICAgICAgPSBub2RlLmdldEF0dHJpYnV0ZSggJ2RhdGEtdHJwLW5vZGUtZ3JvdXAnICsgbm9kZUF0dHJpYnV0ZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlRGVzY3JpcHRpb24gPSBub2RlLmdldEF0dHJpYnV0ZSggJ2RhdGEtdHJwLW5vZGUtZGVzY3JpcHRpb24nICsgbm9kZUF0dHJpYnV0ZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYklEICAgICAgOiBzdHJpbmdJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yICA6IHNlbGVjdG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIDogbm9kZUF0dHJpYnV0ZS5zdWJzdHIoMSksIC8vIHN1YnN0cigxKSBpcyB1c2VkIHRvIHRyaW0gcHJlZml4aW5nIGxpbmUgLSBleC4gLWFsdCB3aWxsIHJlc3VsdCBpbiBhbHQgKG5vIGxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZUdyb3VwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lmdyb3VwID0gbm9kZUdyb3VwXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5vZGVEZXNjcmlwdGlvbiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZXNjcmlwdGlvbiA9IG5vZGVEZXNjcmlwdGlvblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZURhdGEucHVzaCggZW50cnkgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlRGF0YVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXRBbGxTZWxlY3RvcnMoKXtcclxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvcnMgPSBbXVxyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgICAgICA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFBdHRyaWJ1dGVzLmZvckVhY2goIGZ1bmN0aW9uICggZGF0YUF0dHJpYnV0ZSApe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5jb25jYXQoIHNlbGYucHJlcGFyZVNlbGVjdG9yU3RyaW5ncyggZGF0YUF0dHJpYnV0ZSApIClcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcmVwYXJlU2VsZWN0b3JTdHJpbmdzKCBiYXNlTmFtZVNlbGVjdG9yICl7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkX3NlbGVjdG9ycyA9IFtdXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RvcnMuZm9yRWFjaCggZnVuY3Rpb24gKCBzZWxlY3RvclN1ZmZpeCwgaW5kZXggKXtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRfc2VsZWN0b3JzLnB1c2goIGJhc2VOYW1lU2VsZWN0b3IgKyBzZWxlY3RvclN1ZmZpeCAgKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkX3NlbGVjdG9yc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwYXJlbnRVUkwoIHVybCApe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKCAndHJwLWVkaXQtdHJhbnNsYXRpb249cHJldmlldycsICd0cnAtZWRpdC10cmFuc2xhdGlvbj10cnVlJyApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNsZWFuVVJMKCB1cmwgKXtcclxuICAgICAgICAgICAgICAgIC8vbWFrZSByZW1vdmVVcmxQYXJhbWV0ZXIgcmVjdXJzaXZlIGFuZCBvbmx5IGNhbGwgaXQgb25jZSB3aXRoIGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0XHJcbiAgICAgICAgICAgICAgICAvL25lZWQgdG8gc3RyaXBwZWQgP1xyXG4gICAgICAgICAgICAgICAgdXJsID0gdXRpbHMucmVtb3ZlVXJsUGFyYW1ldGVyKCB1cmwsICdsYW5nJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC12aWV3LWFzJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC12aWV3LWFzLW5vbmNlJyApXHJcbiAgICAgICAgICAgICAgICB1cmwgPSB1dGlscy5yZW1vdmVVcmxQYXJhbWV0ZXIoIHVybCwgJ3RycC1lZGl0LXRyYW5zbGF0aW9uJyApXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93U3RyaW5nKCBzdHJpbmcsIHR5cGUgKXtcclxuICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHN0cmluZy5ibG9ja1R5cGUgIT09ICd1bmRlZmluZWQnICYmIHN0cmluZy5ibG9ja1R5cGUgPT09ICcyJyApe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNob3cgZGVwcmVjYXRlZCB0cmFuc2xhdGlvbiBibG9ja3MgaW4gdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09IHRoaXMuZWRpdG9yU3RyaW5ncy5pbWFnZXMgJiYgdHlwZW9mIHN0cmluZy5hdHRyaWJ1dGUgIT0gJ3VuZGVmaW5lZCcgJiYgc3RyaW5nLmF0dHJpYnV0ZSA9PSAnc3JjJyApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHJpbmcuYXR0cmlidXRlICE9PSAndW5kZWZpbmVkJyAmJiAoIHN0cmluZy5hdHRyaWJ1dGUgPT0gJ2hyZWYnIHx8IHN0cmluZy5hdHRyaWJ1dGUgPT0gJ3NyYycgKSApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCBzdHJpbmcuZ3JvdXAgPT09IHR5cGUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGluaXRTdHJpbmdzRHJvcGRvd24oKXtcclxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICggIXRoaXMuaXNTdHJpbmdzRHJvcGRvd25PcGVuKCkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCAnI3RycC1zdHJpbmctY2F0ZWdvcmllcycgKS5zZWxlY3QyKCAnZGVzdHJveScgKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoIHsgcGxhY2Vob2xkZXIgOiBzZWxmLmVkaXRvclN0cmluZ3Muc2VsZWN0X3N0cmluZywgdGVtcGxhdGVSZXN1bHQ6IGZ1bmN0aW9uKG9wdGlvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbCAgICA9IGhlLmRlY29kZSggb3B0aW9uLnRleHQuc3Vic3RyaW5nKDAsIDkwKSApICsgKCAoIG9wdGlvbi50ZXh0Lmxlbmd0aCA8PSA5MCkgPyAnJyA6ICcuLi4nIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gKCBvcHRpb24udGl0bGUgKSA/ICAnKCcgKyBvcHRpb24udGl0bGUgKyAnKScgOiAnJ1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeSggJzxkaXY+JyArIG9yaWdpbmFsICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJzdHJpbmctc2VsZWN0b3ItZGVzY3JpcHRpb25cIj4nICsgZGVzY3JpcHRpb24gKyAnPC9kaXY+JyApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHdpZHRoIDogJzEwMCUnIH0gKS5wcm9wKCAnZGlzYWJsZWQnLCBmYWxzZSApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSggJyN0cnBfc2VsZWN0Ml9vdmVybGF5JyApLmhpZGUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdHJpbmdzRHJvcGRvd25Mb2FkaW5nKCl7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoIHsgcGxhY2Vob2xkZXIgOiB0aGlzLmVkaXRvclN0cmluZ3Muc3RyaW5nc19sb2FkaW5nLCB3aWR0aCA6ICcxMDAlJyB9ICkucHJvcCggJ2Rpc2FibGVkJywgdHJ1ZSApXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByb2Nlc3NPcHRpb25OYW1lKCBuYW1lLCB0eXBlICl7XHJcbiAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT0gJ0ltYWdlcycgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5nZXRGaWxlbmFtZSggbmFtZSApXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmVzY2FwZUh0bWwoIG5hbWUgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpc1N0cmluZ3NEcm9wZG93bk9wZW4oKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqUXVlcnkoICcjdHJwLXN0cmluZy1jYXRlZ29yaWVzJyApLnNlbGVjdDIoICdpc09wZW4nIClcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaGFzVW5zYXZlZENoYW5nZXMoKXtcclxuICAgICAgICAgICAgICAgIGxldCB1bnNhdmVkQ2hhbmdlcyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgICAgIGlmICggdGhpcy5zZWxlY3RlZEluZGV4ZXNBcnJheS5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleGVzQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHRpbmdzWyd0cmFuc2xhdGlvbi1sYW5ndWFnZXMnXS5mb3JFYWNoKGZ1bmN0aW9uIChsYW5ndWFnZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS50cmFuc2xhdGVkICE9PSBzZWxmLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0udHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXS5lZGl0ZWRUcmFuc2xhdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlcyA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlID0gdW5zYXZlZENoYW5nZXNcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5zYXZlZENoYW5nZXNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWZyYW1lTG9hZGVyKCBzdGF0dXMgKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9hZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd0cnAtcHJldmlldy1sb2FkZXInIClcclxuXHJcbiAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09ICdzaG93JyApXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHN0YXR1cyA9PSAnaGlkZScgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByZXZpb3VzU3RyaW5nKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RycC1zdHJpbmctY2F0ZWdvcmllcycpLnZhbHVlXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlID0gK2N1cnJlbnRWYWx1ZSAtIDFcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSggbmV3VmFsdWUgPj0gMCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHJwLXN0cmluZy1jYXRlZ29yaWVzIG9wdGlvblt2YWx1ZT1cIicgKyBuZXdWYWx1ZSArICdcIl0nKS5sZW5ndGggPT09IDAgKXtcclxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZS0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCBuZXdWYWx1ZSA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdHJpbmcgPSBuZXdWYWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5leHRTdHJpbmcoKXtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJwLXN0cmluZy1jYXRlZ29yaWVzJykudmFsdWUsIG5ld1ZhbHVlID0gMFxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCBjdXJyZW50VmFsdWUgIT0gJycgKVxyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gK2N1cnJlbnRWYWx1ZSArIDFcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSggbmV3VmFsdWUgPCB0aGlzLmRpY3Rpb25hcnkubGVuZ3RoICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0cnAtc3RyaW5nLWNhdGVnb3JpZXMgb3B0aW9uW3ZhbHVlPVwiJyArIG5ld1ZhbHVlICsgJ1wiXScpLmxlbmd0aCA9PT0gMCApe1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCBuZXdWYWx1ZSA+PSB0aGlzLmRpY3Rpb25hcnkubGVuZ3RoICl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0cmluZyA9IG5ld1ZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkS2V5Ym9hcmRTaG9ydGN1dHNMaXN0ZW5lcigpe1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaChcIk1hY1wiKSA/IGUubWV0YUtleSA6IGUuY3RybEtleSkgJiYgZS5hbHRLZXkgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENUUkwgKyBBTFQgKyByaWdodCBhcnJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggZS5rZXlDb2RlID09PSAzOSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ3RycF90cmlnZ2VyX25leHRfc3RyaW5nX2V2ZW50JyApICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIGxlZnQgYXJyb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlLmtleUNvZGUgPT09IDM3ICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAndHJwX3RyaWdnZXJfcHJldmlvdXNfc3RyaW5nX2V2ZW50JyApICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd0cnBfdHJpZ2dlcl9uZXh0X3N0cmluZ19ldmVudCcsIHRoaXMubmV4dFN0cmluZyApXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RycF90cmlnZ2VyX3ByZXZpb3VzX3N0cmluZ19ldmVudCcsIHRoaXMucHJldmlvdXNTdHJpbmcgKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZXNpemVJZnJhbWUgKGV2ZW50LCB1aSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsX3dpZHRoID0galF1ZXJ5KHdpbmRvdykud2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGpRdWVyeSggJyN0cnAtY29udHJvbHMnICkud2lkdGgoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZih3aWR0aCA+IHRvdGFsX3dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB0b3RhbF93aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9scy5jc3MoJ3dpZHRoJywgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZpZXdDb250YWluZXIgPSBqUXVlcnkoICcjdHJwLXByZXZpZXcnICk7XHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3Q29udGFpbmVyLmNzcygncmlnaHQnLCB3aWR0aCApO1xyXG4gICAgICAgICAgICAgICAgcHJldmlld0NvbnRhaW5lci5jc3MoJ2xlZnQnLCAoIHdpZHRoIC0gMzQ4ICkgKTtcclxuICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIuY3NzKCd3aWR0aCcsICh0b3RhbF93aWR0aCAtIHdpZHRoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vYWRkIHN1cHBvcnQgZm9yIHYtbW9kZWwgaW4gc2VsZWN0MlxyXG4gICAgICAgIGRpcmVjdGl2ZXM6IHtcclxuICAgICAgICAgICAgc2VsZWN0Mjoge1xyXG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZWwpLm9uKCdzZWxlY3QyOnNlbGVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeShlbCkub24oJ3NlbGVjdDI6dW5zZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChldmVudClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuPC9zY3JpcHQ+XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/editor.vue?vue&type=script&lang=js&\n");
719
 
720
  /***/ }),
721
 
817
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
818
 
819
  "use strict";
820
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _vm.selectedIndexesArray\n ? _c(\n \"div\",\n {\n staticClass: \"trp-controls-section-content\",\n attrs: { id: \"trp-translation-section\" }\n },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.showChangesUnsavedMessage,\n expression: \"showChangesUnsavedMessage\"\n }\n ],\n staticClass: \"trp-changes-unsaved-message\"\n },\n [\n _vm._v(_vm._s(_vm.editorStrings.unsaved_changes) + \" \"),\n _c(\n \"span\",\n {\n staticClass: \"trp-unsaved-changes trp-discard-changes \",\n attrs: { title: _vm.editorStrings.discard_all_title_attr },\n on: { click: _vm.discardAll }\n },\n [_vm._v(_vm._s(_vm.editorStrings.discard_all))]\n ),\n _vm._v(\"?\")\n ]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.languages, function(languageCode, key) {\n return _c(\n \"div\",\n { attrs: { id: \"trp-language-\" + languageCode } },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n (key <= _vm.othersButtonPosition ||\n _vm.showOtherLanguages) &&\n (_vm.selectedIndexesArray &&\n _vm.selectedIndexesArray.length > 0),\n expression:\n \"( (key <= othersButtonPosition) || showOtherLanguages ) && ( selectedIndexesArray && selectedIndexesArray.length > 0 )\"\n }\n ],\n staticClass: \"trp-language-container\"\n },\n [\n _c(\"div\", { staticClass: \"trp-language-name\" }, [\n key == 0\n ? _c(\"span\", [\n _vm._v(_vm._s(_vm.editorStrings.from) + \" \")\n ])\n : _c(\"span\", [\n _vm._v(_vm._s(_vm.editorStrings.to) + \" \")\n ]),\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.completeLanguageNames[languageCode]) +\n \"\\n \"\n ),\n languageCode != \"original\"\n ? _c(\"img\", {\n staticClass: \"trp-language-box-flag-image\",\n attrs: {\n src:\n _vm.flagsPath[languageCode] +\n \"/\" +\n languageCode +\n \".png\",\n width: \"18\",\n height: \"12\",\n alt: languageCode,\n title: _vm.completeLanguageNames[languageCode]\n }\n })\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\n \"table\",\n { staticClass: \"trp-translations-for-language\" },\n [\n _vm.showImageIcon\n ? _c(\n \"td\",\n { staticClass: \"trp-translation-icon-container\" },\n [\n _c(\"span\", {\n staticClass:\n \"trp-translation-icon dashicons dashicons-format-image\"\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"td\",\n { staticClass: \"trp-translations-container\" },\n _vm._l(_vm.selectedIndexesArray, function(\n selectedIndex\n ) {\n return _c(\n \"div\",\n { staticClass: \"trp-string-container\" },\n [\n _vm.dictionary[selectedIndex] &&\n _vm.dictionary[selectedIndex].translationsArray[\n languageCode\n ]\n ? _c(\n \"div\",\n { key: selectedIndex },\n [\n _c(\"translation-input\", {\n attrs: {\n string:\n _vm.dictionary[selectedIndex],\n highlightUnsavedChanges:\n _vm.showChangesUnsavedMessage &&\n _vm.hasUnsavedChanges(\n selectedIndex,\n languageCode\n ),\n editorStrings: _vm.editorStrings\n },\n model: {\n value:\n _vm.dictionary[selectedIndex]\n .translationsArray[languageCode]\n .editedTranslation,\n callback: function($$v) {\n _vm.$set(\n _vm.dictionary[selectedIndex]\n .translationsArray[\n languageCode\n ],\n \"editedTranslation\",\n $$v\n )\n },\n expression:\n \"dictionary[selectedIndex].translationsArray[languageCode].editedTranslation\"\n }\n })\n ],\n 1\n )\n : _vm.dictionary[selectedIndex]\n ? _c(\n \"div\",\n { key: selectedIndex },\n [\n _c(\"translation-input\", {\n attrs: {\n readonly: true,\n string:\n _vm.dictionary[selectedIndex],\n value:\n _vm.dictionary[selectedIndex]\n .original,\n editorStrings: _vm.editorStrings\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"trp-translation-input-footer\",\n attrs: {\n \"data-dictionary-entry\": JSON.stringify(\n _vm.dictionary[selectedIndex]\n )\n }\n },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n _vm.dictionary[selectedIndex]\n .attribute != \"content\" ||\n _vm.dictionary[selectedIndex]\n .attribute != \"\",\n expression:\n \"dictionary[selectedIndex].attribute != 'content' || dictionary[selectedIndex].attribute != ''\"\n }\n ],\n staticClass: \"trp-attribute-name\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.editorStrings[\n _vm.dictionary[selectedIndex]\n .attribute\n ]\n ? _vm.editorStrings[\n _vm.dictionary[selectedIndex]\n .attribute\n ]\n : _vm.editorStrings.text\n )\n )\n ]\n ),\n _vm._v(\" \"),\n _vm.dictionary[selectedIndex] &&\n _vm.dictionary[selectedIndex]\n .translationsArray[languageCode]\n ? _c(\n \"div\",\n {\n staticClass:\n \"trp-discard-changes trp-discard-individual-changes\",\n class: {\n \"trp-unsaved-changes\": _vm.hasUnsavedChanges(\n selectedIndex,\n languageCode\n )\n },\n attrs: {\n title:\n _vm.editorStrings\n .discard_individual_changes_title_attribute\n },\n on: {\n click: function($event) {\n _vm.discardChanges(\n selectedIndex,\n languageCode\n )\n }\n }\n },\n [\n _vm._v(\n _vm._s(_vm.editorStrings.discard)\n )\n ]\n )\n : _vm._e()\n ]\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: key == _vm.othersButtonPosition,\n expression: \"key == othersButtonPosition\"\n }\n ]\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"trp-toggle-languages\",\n class: {\n \"trp-show-other-languages\":\n _vm.showOtherLanguages,\n \"trp-hide-other-languages\": !_vm.showOtherLanguages\n },\n on: {\n click: function($event) {\n _vm.showOtherLanguages = !_vm.showOtherLanguages\n }\n }\n },\n [\n _c(\"span\", [\n _vm._v(\n _vm._s(_vm.showOtherLanguages ? \"⯆\" : \"⯈\") +\n \" \" +\n _vm._s(_vm.editorStrings.other_lang)\n )\n ])\n ]\n )\n ]\n )\n ]\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm._e()\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2pzL2NvbXBvbmVudHMvbGFuZ3VhZ2UtYm94ZXMudnVlP2IxNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsa0RBQWtEO0FBQzVFLHVCQUF1QjtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTLHFDQUFxQyxFQUFFO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLCtCQUErQixtQ0FBbUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtDQUErQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnREFBZ0Q7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDRDQUE0QztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHNDQUFzQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxxQkFBcUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxxQkFBcUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/IS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL2Fzc2V0cy9zcmMvanMvY29tcG9uZW50cy9sYW5ndWFnZS1ib3hlcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Y4MGNmMTAmLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfdm0uc2VsZWN0ZWRJbmRleGVzQXJyYXlcbiAgICA/IF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb24tY29udGVudFwiLFxuICAgICAgICAgIGF0dHJzOiB7IGlkOiBcInRycC10cmFuc2xhdGlvbi1zZWN0aW9uXCIgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1jaGFuZ2VzLXVuc2F2ZWQtbWVzc2FnZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5lZGl0b3JTdHJpbmdzLnVuc2F2ZWRfY2hhbmdlcykgKyBcIiBcIiksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC11bnNhdmVkLWNoYW5nZXMgdHJwLWRpc2NhcmQtY2hhbmdlcyBcIixcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHRpdGxlOiBfdm0uZWRpdG9yU3RyaW5ncy5kaXNjYXJkX2FsbF90aXRsZV9hdHRyIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmRpc2NhcmRBbGwgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3MuZGlzY2FyZF9hbGwpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX3ZtLl92KFwiP1wiKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICksXG4gICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICBfdm0uX2woX3ZtLmxhbmd1YWdlcywgZnVuY3Rpb24obGFuZ3VhZ2VDb2RlLCBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgeyBhdHRyczogeyBpZDogXCJ0cnAtbGFuZ3VhZ2UtXCIgKyBsYW5ndWFnZUNvZGUgfSB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXkgPD0gX3ZtLm90aGVyc0J1dHRvblBvc2l0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dPdGhlckxhbmd1YWdlcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKF92bS5zZWxlY3RlZEluZGV4ZXNBcnJheSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3RlZEluZGV4ZXNBcnJheS5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiKCAoa2V5IDw9IG90aGVyc0J1dHRvblBvc2l0aW9uKSB8fCBzaG93T3RoZXJMYW5ndWFnZXMgKSAmJiAoIHNlbGVjdGVkSW5kZXhlc0FycmF5ICYmIHNlbGVjdGVkSW5kZXhlc0FycmF5Lmxlbmd0aCA+IDAgKVwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtbGFuZ3VhZ2UtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHJwLWxhbmd1YWdlLW5hbWVcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAga2V5ID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJzcGFuXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5lZGl0b3JTdHJpbmdzLmZyb20pICsgXCIgXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF9jKFwic3BhblwiLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy50bykgKyBcIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLmNvbXBsZXRlTGFuZ3VhZ2VOYW1lc1tsYW5ndWFnZUNvZGVdKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGUgIT0gXCJvcmlnaW5hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtbGFuZ3VhZ2UtYm94LWZsYWctaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZmxhZ3NQYXRoW2xhbmd1YWdlQ29kZV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlQ29kZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLnBuZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMThcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiBsYW5ndWFnZUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogX3ZtLmNvbXBsZXRlTGFuZ3VhZ2VOYW1lc1tsYW5ndWFnZUNvZGVdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0YWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwidHJwLXRyYW5zbGF0aW9ucy1mb3ItbGFuZ3VhZ2VcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93SW1hZ2VJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcInRycC10cmFuc2xhdGlvbi1pY29uLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwic3BhblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRycC10cmFuc2xhdGlvbi1pY29uIGRhc2hpY29ucyBkYXNoaWNvbnMtZm9ybWF0LWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ0cnAtdHJhbnNsYXRpb25zLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uc2VsZWN0ZWRJbmRleGVzQXJyYXksIGZ1bmN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwidHJwLXN0cmluZy1jb250YWluZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XS50cmFuc2xhdGlvbnNBcnJheVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsga2V5OiBzZWxlY3RlZEluZGV4IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInRyYW5zbGF0aW9uLWlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0VW5zYXZlZENoYW5nZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFzVW5zYXZlZENoYW5nZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lZGl0ZWRUcmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS4kc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uc0FycmF5W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVkaXRlZFRyYW5zbGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLnRyYW5zbGF0aW9uc0FycmF5W2xhbmd1YWdlQ29kZV0uZWRpdGVkVHJhbnNsYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBrZXk6IHNlbGVjdGVkSW5kZXggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwidHJhbnNsYXRpb24taW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmlnaW5hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtdHJhbnNsYXRpb24taW5wdXQtZm9vdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtZGljdGlvbmFyeS1lbnRyeVwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlICE9IFwiY29udGVudFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUgIT0gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF0uYXR0cmlidXRlICE9ICdjb250ZW50JyB8fCBkaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdLmF0dHJpYnV0ZSAhPSAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtYXR0cmlidXRlLW5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZWRpdG9yU3RyaW5nc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfdm0uZWRpdG9yU3RyaW5nc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpY3Rpb25hcnlbc2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uZWRpdG9yU3RyaW5ncy50ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaWN0aW9uYXJ5W3NlbGVjdGVkSW5kZXhdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGljdGlvbmFyeVtzZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25zQXJyYXlbbGFuZ3VhZ2VDb2RlXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cnAtZGlzY2FyZC1jaGFuZ2VzIHRycC1kaXNjYXJkLWluZGl2aWR1YWwtY2hhbmdlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJwLXVuc2F2ZWQtY2hhbmdlc1wiOiBfdm0uaGFzVW5zYXZlZENoYW5nZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2NhcmRfaW5kaXZpZHVhbF9jaGFuZ2VzX3RpdGxlX2F0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaXNjYXJkQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5lZGl0b3JTdHJpbmdzLmRpc2NhcmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSA9PSBfdm0ub3RoZXJzQnV0dG9uUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJrZXkgPT0gb3RoZXJzQnV0dG9uUG9zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC10b2dnbGUtbGFuZ3VhZ2VzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJwLXNob3ctb3RoZXItbGFuZ3VhZ2VzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93T3RoZXJMYW5ndWFnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRycC1oaWRlLW90aGVyLWxhbmd1YWdlc1wiOiAhX3ZtLnNob3dPdGhlckxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dPdGhlckxhbmd1YWdlcyA9ICFfdm0uc2hvd090aGVyTGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5zaG93T3RoZXJMYW5ndWFnZXMgPyBcIuKvhlwiIDogXCLir4hcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3Mub3RoZXJfbGFuZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIDogX3ZtLl9lKClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/components/language-boxes.vue?vue&type=template&id=3f80cf10&\n");
821
 
822
  /***/ }),
823
 
853
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
854
 
855
  "use strict";
856
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"trp-editor\" } }, [\n _c(\n \"div\",\n { attrs: { id: \"trp-controls\" } },\n [\n _c(\n \"div\",\n { staticClass: \"trp-controls-container\" },\n [\n _c(\"div\", { attrs: { id: \"trp-close-save\" } }, [\n _c(\"a\", {\n attrs: {\n id: \"trp-controls-close\",\n href: _vm.closeURL,\n title: _vm.editorStrings.close\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n { attrs: { id: \"trp-save-and-loader-spinner\" } },\n [\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.loading_strings > 0,\n expression: \"loading_strings > 0\"\n }\n ],\n staticClass: \"trp-ajax-loader\",\n attrs: { id: \"trp-string-saved-ajax-loader\" }\n },\n [_c(\"div\", { staticClass: \"trp-spinner\" })]\n ),\n _vm._v(\" \"),\n _c(\"save-translations\", {\n attrs: {\n selectedIndexesArray: _vm.selectedIndexesArray,\n dictionary: _vm.dictionary,\n settings: _vm.settings,\n nonces: _vm.nonces,\n ajax_url: _vm.ajax_url,\n currentLanguage: _vm.currentLanguage,\n onScreenLanguage: _vm.onScreenLanguage,\n iframe: _vm.iframe,\n currentURL: _vm.currentURL,\n mergingString: _vm.mergingString,\n mergeData: _vm.mergeData,\n editorStrings: _vm.editorStrings\n },\n on: {\n \"translations-saved\": function($event) {\n _vm.showChangesUnsavedMessage = false\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"trp-controls-section\" }, [\n _c(\"div\", { staticClass: \"trp-controls-section-content\" }, [\n _c(\"div\", { attrs: { id: \"trp-language-switch\" } }, [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.currentLanguage,\n expression: \"currentLanguage\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-language-select\", name: \"lang\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.currentLanguage = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.languageNames, function(lang, langIndex) {\n return _c(\"option\", { domProps: { value: langIndex } }, [\n _vm._v(_vm._s(lang))\n ])\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-string-list\" } }, [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedString,\n expression: \"selectedString\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-string-categories\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedString = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.stringGroups, function(group) {\n return _c(\n \"optgroup\",\n { attrs: { label: group } },\n _vm._l(_vm.dictionary, function(string, index) {\n return _vm.showString(string, group)\n ? _c(\n \"option\",\n {\n attrs: {\n title: string.description,\n \"data-database-id\": string.dbID,\n \"data-group\": string.group\n },\n domProps: { value: index }\n },\n [\n _vm._v(\n _vm._s(\n _vm.processOptionName(\n string.original,\n group\n )\n )\n )\n ]\n )\n : _vm._e()\n }),\n 0\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-next-previous\" } }, [\n _c(\n \"button\",\n {\n staticClass: \"trp-next-previous-buttons\",\n attrs: {\n type: \"button\",\n id: \"trp-previous\",\n title: _vm.editorStrings.previous_title_attr\n },\n on: {\n click: function($event) {\n _vm.previousString()\n }\n }\n },\n [\n _c(\"span\", [_vm._v(\"«\")]),\n _vm._v(\" \" + _vm._s(_vm.editorStrings.previous))\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"trp-next-previous-buttons\",\n attrs: {\n type: \"button\",\n id: \"trp-next\",\n title: _vm.editorStrings.next_title_attr\n },\n on: {\n click: function($event) {\n _vm.nextString()\n }\n }\n },\n [\n _vm._v(_vm._s(_vm.editorStrings.next) + \" \"),\n _c(\"span\", [_vm._v(\"»\")])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-view-as\" } }, [\n _c(\"div\", { attrs: { id: \"trp-view-as-description\" } }, [\n _vm._v(_vm._s(_vm.editorStrings.view_as))\n ]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.viewAs,\n expression: \"viewAs\"\n },\n { name: \"select2\", rawName: \"v-select2\" }\n ],\n attrs: { id: \"trp-view-as-select\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.viewAs = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.roles, function(role, roleIndex) {\n return _c(\n \"option\",\n {\n attrs: {\n disabled: !role,\n title: !role ? _vm.editorStrings.view_as_pro : \"\"\n },\n domProps: { value: role }\n },\n [_vm._v(_vm._s(roleIndex))]\n )\n }),\n 0\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.selectedString !== null,\n expression: \"selectedString !== null\"\n }\n ],\n staticClass: \"trp-controls-section\"\n },\n [\n _c(\"language-boxes\", {\n attrs: {\n selectedIndexesArray: _vm.selectedIndexesArray,\n dictionary: _vm.dictionary,\n currentLanguage: _vm.currentLanguage,\n onScreenLanguage: _vm.onScreenLanguage,\n languageNames: _vm.languageNames,\n settings: _vm.settings,\n showChangesUnsavedMessage: _vm.showChangesUnsavedMessage,\n editorStrings: _vm.editorStrings,\n flagsPath: _vm.flagsPath,\n iframe: _vm.iframe\n },\n on: {\n \"discarded-changes\": function($event) {\n _vm.hasUnsavedChanges()\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"extra-content\", {\n attrs: {\n languageNames: _vm.languageNames,\n editorStrings: _vm.editorStrings,\n paidVersion: _vm.paid_version\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.translationNotLoadedYet,\n expression: \"translationNotLoadedYet\"\n }\n ],\n staticClass: \"trp-controls-section\"\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"trp-controls-section-content\",\n attrs: { id: \"trp-translation-not-ready-section\" }\n },\n [\n _c(\"p\", {\n domProps: {\n innerHTML: _vm._s(\n _vm.editorStrings.translation_not_loaded_yet\n )\n }\n })\n ]\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp_select2_overlay\" } }),\n _vm._v(\" \"),\n _c(\"hover-actions\", {\n ref: \"hoverActions\",\n attrs: {\n dictionary: _vm.dictionary,\n settings: _vm.settings,\n iframe: _vm.iframe,\n dataAttributes: _vm.dataAttributes,\n mergeRules: _vm.mergeRules,\n nonces: _vm.nonces,\n ajax_url: _vm.ajax_url,\n mergeData: _vm.mergeData,\n editorStrings: _vm.editorStrings\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-preview\" } }, [\n _c(\"iframe\", {\n attrs: { id: \"trp-preview-iframe\", src: _vm.urlToLoad },\n on: { load: _vm.iFrameLoaded }\n }),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"trp-preview-loader\" } }, [\n _c(\n \"svg\",\n {\n staticClass: \"trp-loader\",\n attrs: {\n width: \"65px\",\n height: \"65px\",\n viewBox: \"0 0 66 66\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }\n },\n [\n _c(\"circle\", {\n staticClass: \"trp-circle\",\n attrs: {\n fill: \"none\",\n \"stroke-width\": \"6\",\n \"stroke-linecap\": \"round\",\n cx: \"33\",\n cy: \"33\",\n r: \"30\"\n }\n })\n ]\n )\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2pzL2VkaXRvci52dWU/NTEwNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTLG1CQUFtQixFQUFFO0FBQ2xEO0FBQ0E7QUFDQSxPQUFPLFNBQVMscUJBQXFCLEVBQUU7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3Q0FBd0M7QUFDbkQ7QUFDQSx1QkFBdUIsU0FBUyx1QkFBdUIsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVMsb0NBQW9DLEVBQUU7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIscUJBQXFCO0FBQ3JCLGdDQUFnQyw2QkFBNkI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNDQUFzQztBQUM3RCx5QkFBeUIsOENBQThDO0FBQ3ZFLDJCQUEyQixTQUFTLDRCQUE0QixFQUFFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQSw4QkFBOEIsMENBQTBDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSwyQ0FBMkMsWUFBWSxtQkFBbUIsRUFBRTtBQUM1RTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsd0JBQXdCLEVBQUU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBLDhCQUE4Qiw4QkFBOEI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUyxlQUFlLEVBQUU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLDZDQUE2QztBQUM3QyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUywwQkFBMEIsRUFBRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsb0JBQW9CLEVBQUU7QUFDMUQsNkJBQTZCLFNBQVMsZ0NBQWdDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBLDhCQUE4QiwyQkFBMkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQixxQ0FBcUM7QUFDckMseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTLDRCQUE0QixFQUFFO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVMsb0JBQW9CLEVBQUU7QUFDOUM7QUFDQSxnQkFBZ0IsK0NBQStDO0FBQy9ELGFBQWE7QUFDYixPQUFPO0FBQ1A7QUFDQSxpQkFBaUIsU0FBUywyQkFBMkIsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/IS4vYXNzZXRzL3NyYy9qcy9lZGl0b3IudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWIwNDZlOGVjJi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtZWRpdG9yXCIgfSB9LCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBhdHRyczogeyBpZDogXCJ0cnAtY29udHJvbHNcIiB9IH0sXG4gICAgICBbXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ0cnAtY29udHJvbHMtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1jbG9zZS1zYXZlXCIgfSB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiYVwiLCB7XG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBcInRycC1jb250cm9scy1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgaHJlZjogX3ZtLmNsb3NlVVJMLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLmNsb3NlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7IGF0dHJzOiB7IGlkOiBcInRycC1zYXZlLWFuZC1sb2FkZXItc3Bpbm5lclwiIH0gfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmxvYWRpbmdfc3RyaW5ncyA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwibG9hZGluZ19zdHJpbmdzID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtYWpheC1sb2FkZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJ0cnAtc3RyaW5nLXNhdmVkLWFqYXgtbG9hZGVyXCIgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0cnAtc3Bpbm5lclwiIH0pXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICBfYyhcInNhdmUtdHJhbnNsYXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheTogX3ZtLnNlbGVjdGVkSW5kZXhlc0FycmF5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnk6IF92bS5kaWN0aW9uYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBfdm0uc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgbm9uY2VzOiBfdm0ubm9uY2VzLFxuICAgICAgICAgICAgICAgICAgICAgIGFqYXhfdXJsOiBfdm0uYWpheF91cmwsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlOiBfdm0uY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgIG9uU2NyZWVuTGFuZ3VhZ2U6IF92bS5vblNjcmVlbkxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogX3ZtLmlmcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VVJMOiBfdm0uY3VycmVudFVSTCxcbiAgICAgICAgICAgICAgICAgICAgICBtZXJnaW5nU3RyaW5nOiBfdm0ubWVyZ2luZ1N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBtZXJnZURhdGE6IF92bS5tZXJnZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBcInRyYW5zbGF0aW9ucy1zYXZlZFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb24tY29udGVudFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1sYW5ndWFnZS1zd2l0Y2hcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmN1cnJlbnRMYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJjdXJyZW50TGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJzZWxlY3QyXCIsIHJhd05hbWU6IFwidi1zZWxlY3QyXCIgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwidHJwLWxhbmd1YWdlLXNlbGVjdFwiLCBuYW1lOiBcImxhbmdcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsIGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uY3VycmVudExhbmd1YWdlID0gJGV2ZW50LnRhcmdldC5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJCRzZWxlY3RlZFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJCRzZWxlY3RlZFZhbFswXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5sYW5ndWFnZU5hbWVzLCBmdW5jdGlvbihsYW5nLCBsYW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXCJvcHRpb25cIiwgeyBkb21Qcm9wczogeyB2YWx1ZTogbGFuZ0luZGV4IH0gfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhsYW5nKSlcbiAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBhdHRyczogeyBpZDogXCJ0cnAtc3RyaW5nLWxpc3RcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnNlbGVjdGVkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInNlbGVjdGVkU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IFwic2VsZWN0MlwiLCByYXdOYW1lOiBcInYtc2VsZWN0MlwiIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGlkOiBcInRycC1zdHJpbmctY2F0ZWdvcmllc1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkJHNlbGVjdGVkVmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3RlZFN0cmluZyA9ICRldmVudC50YXJnZXQubXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICQkc2VsZWN0ZWRWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICQkc2VsZWN0ZWRWYWxbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uc3RyaW5nR3JvdXBzLCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgbGFiZWw6IGdyb3VwIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uZGljdGlvbmFyeSwgZnVuY3Rpb24oc3RyaW5nLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnNob3dTdHJpbmcoc3RyaW5nLCBncm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJpbmcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtZGF0YWJhc2UtaWRcIjogc3RyaW5nLmRiSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtZ3JvdXBcIjogc3RyaW5nLmdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogaW5kZXggfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucHJvY2Vzc09wdGlvbk5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLm9yaWdpbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1uZXh0LXByZXZpb3VzXCIgfSB9LCBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1uZXh0LXByZXZpb3VzLWJ1dHRvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcInRycC1wcmV2aW91c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLnByZXZpb3VzX3RpdGxlX2F0dHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5wcmV2aW91c1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLCq1wiKV0pLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiArIF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy5wcmV2aW91cykpXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtbmV4dC1wcmV2aW91cy1idXR0b25zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJ0cnAtbmV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF92bS5lZGl0b3JTdHJpbmdzLm5leHRfdGl0bGVfYXR0clxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLm5leHRTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmVkaXRvclN0cmluZ3MubmV4dCkgKyBcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLCu1wiKV0pXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXNcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXMtZGVzY3JpcHRpb25cIiB9IH0sIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uZWRpdG9yU3RyaW5ncy52aWV3X2FzKSlcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpZXdBcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aWV3QXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJzZWxlY3QyXCIsIHJhd05hbWU6IFwidi1zZWxlY3QyXCIgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwidHJwLXZpZXctYXMtc2VsZWN0XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICQkc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLCBmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gXCJfdmFsdWVcIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnZpZXdBcyA9ICRldmVudC50YXJnZXQubXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICQkc2VsZWN0ZWRWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICQkc2VsZWN0ZWRWYWxbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0ucm9sZXMsIGZ1bmN0aW9uKHJvbGUsIHJvbGVJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFyb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAhcm9sZSA/IF92bS5lZGl0b3JTdHJpbmdzLnZpZXdfYXNfcHJvIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogcm9sZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3Mocm9sZUluZGV4KSldXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2VsZWN0ZWRTdHJpbmcgIT09IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2VsZWN0ZWRTdHJpbmcgIT09IG51bGxcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXCJsYW5ndWFnZS1ib3hlc1wiLCB7XG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ZXNBcnJheTogX3ZtLnNlbGVjdGVkSW5kZXhlc0FycmF5LFxuICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5OiBfdm0uZGljdGlvbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlOiBfdm0uY3VycmVudExhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICBvblNjcmVlbkxhbmd1YWdlOiBfdm0ub25TY3JlZW5MYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VOYW1lczogX3ZtLmxhbmd1YWdlTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBfdm0uc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzVW5zYXZlZE1lc3NhZ2U6IF92bS5zaG93Q2hhbmdlc1Vuc2F2ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3JTdHJpbmdzOiBfdm0uZWRpdG9yU3RyaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3NQYXRoOiBfdm0uZmxhZ3NQYXRoLFxuICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IF92bS5pZnJhbWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBcImRpc2NhcmRlZC1jaGFuZ2VzXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5oYXNVbnNhdmVkQ2hhbmdlcygpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF9jKFwiZXh0cmEtY29udGVudFwiLCB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2VOYW1lczogX3ZtLmxhbmd1YWdlTmFtZXMsXG4gICAgICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3MsXG4gICAgICAgICAgICAgICAgcGFpZFZlcnNpb246IF92bS5wYWlkX3ZlcnNpb25cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnRyYW5zbGF0aW9uTm90TG9hZGVkWWV0LFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInRyYW5zbGF0aW9uTm90TG9hZGVkWWV0XCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1jb250cm9scy1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidHJwLWNvbnRyb2xzLXNlY3Rpb24tY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJ0cnAtdHJhbnNsYXRpb24tbm90LXJlYWR5LXNlY3Rpb25cIiB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcInBcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmVkaXRvclN0cmluZ3MudHJhbnNsYXRpb25fbm90X2xvYWRlZF95ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSxcbiAgICAgICAgICAxXG4gICAgICAgICksXG4gICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgYXR0cnM6IHsgaWQ6IFwidHJwX3NlbGVjdDJfb3ZlcmxheVwiIH0gfSksXG4gICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgIF9jKFwiaG92ZXItYWN0aW9uc1wiLCB7XG4gICAgICAgICAgcmVmOiBcImhvdmVyQWN0aW9uc1wiLFxuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBkaWN0aW9uYXJ5OiBfdm0uZGljdGlvbmFyeSxcbiAgICAgICAgICAgIHNldHRpbmdzOiBfdm0uc2V0dGluZ3MsXG4gICAgICAgICAgICBpZnJhbWU6IF92bS5pZnJhbWUsXG4gICAgICAgICAgICBkYXRhQXR0cmlidXRlczogX3ZtLmRhdGFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgbWVyZ2VSdWxlczogX3ZtLm1lcmdlUnVsZXMsXG4gICAgICAgICAgICBub25jZXM6IF92bS5ub25jZXMsXG4gICAgICAgICAgICBhamF4X3VybDogX3ZtLmFqYXhfdXJsLFxuICAgICAgICAgICAgbWVyZ2VEYXRhOiBfdm0ubWVyZ2VEYXRhLFxuICAgICAgICAgICAgZWRpdG9yU3RyaW5nczogX3ZtLmVkaXRvclN0cmluZ3NcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgMVxuICAgICksXG4gICAgX3ZtLl92KFwiIFwiKSxcbiAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1wcmV2aWV3XCIgfSB9LCBbXG4gICAgICBfYyhcImlmcmFtZVwiLCB7XG4gICAgICAgIGF0dHJzOiB7IGlkOiBcInRycC1wcmV2aWV3LWlmcmFtZVwiLCBzcmM6IF92bS51cmxUb0xvYWQgfSxcbiAgICAgICAgb246IHsgbG9hZDogX3ZtLmlGcmFtZUxvYWRlZCB9XG4gICAgICB9KSxcbiAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICBfYyhcImRpdlwiLCB7IGF0dHJzOiB7IGlkOiBcInRycC1wcmV2aWV3LWxvYWRlclwiIH0gfSwgW1xuICAgICAgICBfYyhcbiAgICAgICAgICBcInN2Z1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInRycC1sb2FkZXJcIixcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjY1cHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjY1cHhcIixcbiAgICAgICAgICAgICAgdmlld0JveDogXCIwIDAgNjYgNjZcIixcbiAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX2MoXCJjaXJjbGVcIiwge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0cnAtY2lyY2xlXCIsXG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogXCI2XCIsXG4gICAgICAgICAgICAgICAgXCJzdHJva2UtbGluZWNhcFwiOiBcInJvdW5kXCIsXG4gICAgICAgICAgICAgICAgY3g6IFwiMzNcIixcbiAgICAgICAgICAgICAgICBjeTogXCIzM1wiLFxuICAgICAgICAgICAgICAgIHI6IFwiMzBcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICBdKVxuICBdKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/src/js/editor.vue?vue&type=template&id=b046e8ec&\n");
857
 
858
  /***/ }),
859
 
assets/js/trp-language-switcher.js DELETED
@@ -1,114 +0,0 @@
1
- /**
2
- * Change language function for shortcode language switcher.
3
- */
4
-
5
- function trp_change_language( select ){
6
- select.form.action = document.querySelector('link[hreflang="' + select.value + '"]').href;
7
- if ( typeof parent.trpEditor == 'undefined' ) {
8
- select.form.submit();
9
- }
10
- }
11
-
12
- jQuery( document ).ready( function( ) {
13
-
14
- sessionStorage.removeItem('wc_fragments');
15
-
16
- // Run this code only if flags are enabled in shortcode language switcher
17
- if( trp_language_switcher_data.shortcode_ls_flags ) {
18
- jQuery.widget( 'trp.iconselectmenu', jQuery.ui.selectmenu, {
19
- _renderItem : function( ul, item ) {
20
- // Check if Translation Editor and add data-trp-unpreviewable
21
- var data_trp_unpreviewable = '';
22
- if( typeof parent.trpEditor != 'undefined' ) {
23
- data_trp_unpreviewable = 'data-trp-unpreviewable="trp-unpreviewable"';
24
- }
25
-
26
- // Get language title attr
27
- var title = jQuery( jQuery( item )[0]['element'][0] ).attr( 'title' );
28
-
29
- var li = jQuery( '<li class="trp-ls-li" data-no-translation ' + data_trp_unpreviewable + '>' );
30
- var wrapper = jQuery( '<div class="trp-ls-div" style="display: inline-block;" title="' + jQuery.trim( title ) + '">' );
31
-
32
- if( item.disabled ) {
33
- li.addClass( 'ui-state-disabled' );
34
- }
35
-
36
- if( jQuery.trim( item.label ) ) {
37
- jQuery( '<span>', {
38
- text : jQuery.trim( item.label )
39
- } ).appendTo( wrapper );
40
- }
41
-
42
- jQuery( '<span>', {
43
- style : item.element.attr( 'data-style' ),
44
- 'class' : 'ui-icon ' + item.element.attr( 'data-class' )
45
- } ).prependTo( wrapper );
46
-
47
- return li.append( wrapper ).appendTo( ul );
48
- }
49
- } );
50
-
51
-
52
- jQuery( '.trp-language-switcher-select' ).each( function() {
53
- jQuery( this )
54
- .iconselectmenu( {
55
- create: function ( event, ui ) {
56
- // Remove span for language name when empty
57
- if( ! jQuery.trim( jQuery( jQuery( event )[0]['target'] ).text() ) ) {
58
- jQuery( 'form.trp-language-switcher-form .ui-selectmenu-text' ).remove();
59
- }
60
-
61
- // Add title attr
62
- jQuery( '.trp-current-language-icon' ).closest( 'span.ui-selectmenu-button' ).attr(
63
- 'title', jQuery.trim( jQuery( '.trp-language-switcher-select' ).find( ':selected' ).attr( 'title' ) )
64
- );
65
- },
66
- change: function( event, ui ) {
67
- // Change language
68
- if( typeof parent.trpEditor == 'undefined' ) {
69
- window.location.replace( document.querySelector( 'link[hreflang="' + ui.item.value + '"]' ).href );
70
- }
71
- },
72
- select: function( event, ui ) {
73
- // Add the right flag to the selected option
74
- jQuery( this ).closest( 'form.trp-language-switcher-form' ).find( '.trp-current-language-icon' )
75
- .css( 'background-image', 'url(' + jQuery( this ).find( 'option[value="' + ui.item.value + '"]' ).data( 'flag-url' ) + ')' );
76
- },
77
- icons: {
78
- button : 'trp-current-language-icon'
79
- }
80
- } ).iconselectmenu( 'menuWidget' ).addClass( 'ui-menu-icons trp-ls-options-with-flag-icons' );
81
- } );
82
-
83
- // Add arrow-down icon to the jQuery UI select
84
- jQuery( '<span>', {
85
- 'class' : 'dashicons dashicons-arrow-down'
86
- } ).appendTo( jQuery( 'form.trp-language-switcher-form .ui-selectmenu-button' ) );
87
-
88
- // Add the right flag to the selected option
89
- jQuery( '.ui-state-default .ui-icon.trp-current-language-icon' ).each( function() {
90
- jQuery( this ).css( 'background-image', 'url(' + jQuery( this ).closest( 'form.trp-language-switcher-form' ).find( 'select.trp-language-switcher-select' ).find( ':selected' ).data( 'flag-url' ) + ')' );
91
- } );
92
-
93
- // Adjust the font size of select options based on the select font size
94
- jQuery( 'form.trp-language-switcher-form .ui-selectmenu-button' ).each( function() {
95
- var id = jQuery( this ).attr( 'id' );
96
- var font_size = jQuery( this ).css( 'font-size' );
97
-
98
- jQuery( '.ui-menu.trp-ls-options-with-flag-icons' ).each( function() {
99
- if( jQuery( this ).attr( 'aria-labelledby' ) == id ) {
100
- jQuery( this ).css( 'font-size', font_size );
101
- }
102
- } );
103
- } );
104
-
105
- // Check if Translation Editor and add data-trp-unpreviewable
106
- if( typeof parent.trpEditor != 'undefined' ) {
107
- jQuery( 'form.trp-language-switcher-form .ui-selectmenu-button' ).each( function() {
108
- jQuery( this ).attr( 'data-trp-unpreviewable', 'trp-unpreviewable' );
109
- jQuery( this ).find( 'span' ).attr( 'data-trp-unpreviewable', 'trp-unpreviewable' );
110
- } );
111
- }
112
- }
113
-
114
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/trp-translate-dom-changes.js CHANGED
@@ -22,23 +22,24 @@ function TRP_Translator(){
22
  /**
23
  * Ajax request to get translations for strings
24
  */
25
- this.ajax_get_translation = function( nodesInfo, string_originals, url ) {
26
  jQuery.ajax({
27
  url: url,
28
  type: 'post',
29
  dataType: 'json',
30
  data: {
31
- action : 'trp_get_translations_regular',
32
- all_languages : 'false',
33
- security : trp_data['gettranslationsnonceregular'],
34
- language : language_to_query,
35
- original_language : original_language, // used for trp custom ajax
36
- originals : JSON.stringify( string_originals ),
37
- dynamic_strings : 'true'
 
38
  },
39
  success: function( response ) {
40
  if ( response === 'error' ) {
41
- _this.ajax_get_translation( nodesInfo, string_originals, wp_ajax_url );
42
  console.log( 'Notice: TranslatePress trp-ajax request uses fall back to admin ajax.' );
43
  }else{
44
  _this.update_strings( response, nodesInfo );
@@ -46,7 +47,7 @@ function TRP_Translator(){
46
  },
47
  error: function( errorThrown ){
48
  if ( url == custom_ajax_url ){
49
- _this.ajax_get_translation( nodesInfo, string_originals, wp_ajax_url );
50
  console.log( 'Notice: TranslatePress trp-ajax request uses fall back to admin ajax.' );
51
  }else{
52
  _this.update_strings( null, nodesInfo );
@@ -160,6 +161,7 @@ function TRP_Translator(){
160
  this.detect_new_strings = function( mutations ){
161
  var string_originals = [];
162
  var nodesInfo = [];
 
163
  var translateable;
164
  mutations.forEach( function (mutation) {
165
  for (var i = 0; i < mutation.addedNodes.length; i++) {
@@ -182,6 +184,7 @@ function TRP_Translator(){
182
  translateable = _this.get_translateable_attributes( node )
183
  string_originals = string_originals.concat( translateable.string_originals );
184
  nodesInfo = nodesInfo.concat( translateable.nodesInfo );
 
185
  }
186
 
187
  if ( mutation.attributeName ){
@@ -196,11 +199,12 @@ function TRP_Translator(){
196
  translateable = _this.get_translateable_attributes( mutation.target )
197
  string_originals = string_originals.concat( translateable.string_originals );
198
  nodesInfo = nodesInfo.concat( translateable.nodesInfo );
 
199
  }
200
  });
201
  if ( nodesInfo.length > 0 ) {
202
  var ajax_url_to_call = (_this.is_editor) ? wp_ajax_url : custom_ajax_url;
203
- _this.ajax_get_translation( nodesInfo, string_originals, ajax_url_to_call );
204
  }
205
  };
206
 
@@ -285,6 +289,8 @@ function TRP_Translator(){
285
  this.get_translateable_attributes = function ( node ) {
286
  var nodesInfo = []
287
  var string_originals = []
 
 
288
  for (var trp_attribute_key in trp_data.trp_attributes_selectors) {
289
  if (trp_data.trp_attributes_selectors.hasOwnProperty(trp_attribute_key)) {
290
  var attribute_selector_item = trp_data.trp_attributes_selectors[trp_attribute_key]
@@ -304,12 +310,18 @@ function TRP_Translator(){
304
  if ( trp_data ['showdynamiccontentbeforetranslation'] == false ) {
305
  all_nodes[j].setAttribute( attribute_selector_item.accessor, '' );
306
  }
 
 
 
 
 
 
307
  }
308
  }
309
  }
310
  }
311
  }
312
- return { 'string_originals': string_originals, 'nodesInfo': nodesInfo };
313
  }
314
 
315
  function get_string_from_node( node ){
22
  /**
23
  * Ajax request to get translations for strings
24
  */
25
+ this.ajax_get_translation = function( nodesInfo, string_originals, url, skip_machine_translation ) {
26
  jQuery.ajax({
27
  url: url,
28
  type: 'post',
29
  dataType: 'json',
30
  data: {
31
+ action : 'trp_get_translations_regular',
32
+ all_languages : 'false',
33
+ security : trp_data['gettranslationsnonceregular'],
34
+ language : language_to_query,
35
+ original_language : original_language, // used for trp custom ajax
36
+ originals : JSON.stringify( string_originals ),
37
+ skip_machine_translation : JSON.stringify( skip_machine_translation ),
38
+ dynamic_strings : 'true'
39
  },
40
  success: function( response ) {
41
  if ( response === 'error' ) {
42
+ _this.ajax_get_translation( nodesInfo, string_originals, wp_ajax_url, skip_machine_translation );
43
  console.log( 'Notice: TranslatePress trp-ajax request uses fall back to admin ajax.' );
44
  }else{
45
  _this.update_strings( response, nodesInfo );
47
  },
48
  error: function( errorThrown ){
49
  if ( url == custom_ajax_url ){
50
+ _this.ajax_get_translation( nodesInfo, string_originals, wp_ajax_url, skip_machine_translation );
51
  console.log( 'Notice: TranslatePress trp-ajax request uses fall back to admin ajax.' );
52
  }else{
53
  _this.update_strings( null, nodesInfo );
161
  this.detect_new_strings = function( mutations ){
162
  var string_originals = [];
163
  var nodesInfo = [];
164
+ var skip_machine_translation = [];
165
  var translateable;
166
  mutations.forEach( function (mutation) {
167
  for (var i = 0; i < mutation.addedNodes.length; i++) {
184
  translateable = _this.get_translateable_attributes( node )
185
  string_originals = string_originals.concat( translateable.string_originals );
186
  nodesInfo = nodesInfo.concat( translateable.nodesInfo );
187
+ skip_machine_translation = skip_machine_translation.concat( translateable.skip_machine_translation );
188
  }
189
 
190
  if ( mutation.attributeName ){
199
  translateable = _this.get_translateable_attributes( mutation.target )
200
  string_originals = string_originals.concat( translateable.string_originals );
201
  nodesInfo = nodesInfo.concat( translateable.nodesInfo );
202
+ skip_machine_translation = skip_machine_translation.concat( translateable.skip_machine_translation );
203
  }
204
  });
205
  if ( nodesInfo.length > 0 ) {
206
  var ajax_url_to_call = (_this.is_editor) ? wp_ajax_url : custom_ajax_url;
207
+ _this.ajax_get_translation( nodesInfo, string_originals, ajax_url_to_call, skip_machine_translation );
208
  }
209
  };
210
 
289
  this.get_translateable_attributes = function ( node ) {
290
  var nodesInfo = []
291
  var string_originals = []
292
+ var skip_attr_machine_translation = [ 'href', 'src' ]
293
+ var skip_machine_translation = []
294
  for (var trp_attribute_key in trp_data.trp_attributes_selectors) {
295
  if (trp_data.trp_attributes_selectors.hasOwnProperty(trp_attribute_key)) {
296
  var attribute_selector_item = trp_data.trp_attributes_selectors[trp_attribute_key]
310
  if ( trp_data ['showdynamiccontentbeforetranslation'] == false ) {
311
  all_nodes[j].setAttribute( attribute_selector_item.accessor, '' );
312
  }
313
+ for ( var s = 0; s < skip_attr_machine_translation.length; s++ ){
314
+ if ( attribute_selector_item.accessor === skip_attr_machine_translation[s] ){
315
+ skip_machine_translation.push( attribute_content )
316
+ break
317
+ }
318
+ }
319
  }
320
  }
321
  }
322
  }
323
  }
324
+ return { 'string_originals': string_originals, 'nodesInfo': nodesInfo, 'skip_machine_translation': skip_machine_translation };
325
  }
326
 
327
  function get_string_from_node( node ){
class-translate-press.php CHANGED
@@ -46,7 +46,7 @@ class TRP_Translate_Press{
46
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
47
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
48
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
49
- define( 'TRP_PLUGIN_VERSION', '1.4.8' );
50
 
51
  wp_cache_add_non_persistent_groups(array('trp'));
52
 
@@ -214,6 +214,7 @@ class TRP_Translate_Press{
214
  /* handle CDATA str replacement from the content as it is messing up the renderer */
215
  $this->loader->add_filter( "trp_before_translate_content", $this->translation_render, 'handle_cdata', 1000 );
216
  $this->loader->add_action( "trp_set_translation_for_attribute", $this->translation_render, 'translate_image_srcset_attributes', 10, 3 );
 
217
 
218
  /* apply translation filters for REST API response */
219
  $post_types = get_post_types();
46
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
47
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
48
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
49
+ define( 'TRP_PLUGIN_VERSION', '1.4.9' );
50
 
51
  wp_cache_add_non_persistent_groups(array('trp'));
52
 
214
  /* handle CDATA str replacement from the content as it is messing up the renderer */
215
  $this->loader->add_filter( "trp_before_translate_content", $this->translation_render, 'handle_cdata', 1000 );
216
  $this->loader->add_action( "trp_set_translation_for_attribute", $this->translation_render, 'translate_image_srcset_attributes', 10, 3 );
217
+ $this->loader->add_action( "trp_allow_machine_translation_for_string", $this->translation_render, 'allow_machine_translation_for_string', 10, 4 );
218
 
219
  /* apply translation filters for REST API response */
220
  $post_types = get_post_types();
includes/class-editor-api-regular-strings.php CHANGED
@@ -31,6 +31,7 @@ class TRP_Editor_Api_Regular_Strings {
31
  check_ajax_referer( 'get_translations', 'security' );
32
  if ( isset( $_POST['action'] ) && $_POST['action'] === 'trp_get_translations_regular' && !empty( $_POST['language'] ) && in_array( $_POST['language'], $this->settings['translation-languages'] ) ) {
33
  $originals = (empty($_POST['originals']) )? array() : json_decode(stripslashes($_POST['originals']));
 
34
  $ids = (empty($_POST['string_ids']) )? array() : json_decode(stripslashes($_POST['string_ids']));
35
  if ( is_array( $ids ) || is_array( $originals) ) {
36
  $trp = TRP_Translate_Press::get_trp_instance();
@@ -41,7 +42,7 @@ class TRP_Editor_Api_Regular_Strings {
41
  $this->translation_manager = $trp->get_component('translation_manager');
42
  }
43
  $block_type = $this->trp_query->get_constant_block_type_regular_string();
44
- $dictionaries = $this->get_translation_for_strings( $ids, $originals, $block_type );
45
 
46
  $localized_text = $this->translation_manager->string_groups();
47
  $string_group = __('Others', 'translatepress-multilingual'); // this type is not registered in the string types because it will be overwritten by the content in data-trp-node-type
@@ -65,7 +66,7 @@ class TRP_Editor_Api_Regular_Strings {
65
  *
66
  * @return array
67
  */
68
- protected function get_translation_for_strings( $ids, $originals, $block_type = null ){
69
  $trp = TRP_Translate_Press::get_trp_instance();
70
  if ( ! $this->trp_query ) {
71
  $this->trp_query = $trp->get_component( 'query' );
@@ -108,7 +109,7 @@ class TRP_Editor_Api_Regular_Strings {
108
  // necessary in order to obtain all the original strings
109
  if ( $this->settings['default-language'] != $current_language ) {
110
  if ( !empty ( $original_array ) && current_user_can ( apply_filters( 'trp_translating_capability', 'manage_options' ) ) ) {
111
- $this->translation_render->process_strings($original_array, $current_language, $block_type);
112
  }
113
  $dictionaries[$current_language] = $this->trp_query->get_string_rows( $id_array, $original_array, $current_language );
114
  }else{
@@ -129,12 +130,27 @@ class TRP_Editor_Api_Regular_Strings {
129
  $original_strings = $this->extract_original_strings($dictionaries[$current_language], $original_array, $id_array);
130
  }
131
  if (current_user_can(apply_filters( 'trp_translating_capability', 'manage_options' ))) {
132
- $this->translation_render->process_strings($original_strings, $language, $block_type);
133
  }
134
  $dictionaries[$language] = $this->trp_query->get_string_rows(array(), $original_strings, $language);
135
  }
136
  }
137
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  return $dictionaries;
139
  }
140
 
@@ -244,7 +260,7 @@ class TRP_Editor_Api_Regular_Strings {
244
  $active_block_type = $this->trp_query->get_constant_block_type_active();
245
  foreach( $this->settings['translation-languages'] as $language ){
246
  if ( $language != $this->settings['default-language'] ){
247
- $dictionaries = $this->get_translation_for_strings( array(), array( stripslashes( $_POST['original'] ) ), $active_block_type );
248
  break;
249
  }
250
  }
31
  check_ajax_referer( 'get_translations', 'security' );
32
  if ( isset( $_POST['action'] ) && $_POST['action'] === 'trp_get_translations_regular' && !empty( $_POST['language'] ) && in_array( $_POST['language'], $this->settings['translation-languages'] ) ) {
33
  $originals = (empty($_POST['originals']) )? array() : json_decode(stripslashes($_POST['originals']));
34
+ $skip_machine_translation = (empty($_POST['skip_machine_translation']) )? array() : json_decode(stripslashes($_POST['skip_machine_translation']));
35
  $ids = (empty($_POST['string_ids']) )? array() : json_decode(stripslashes($_POST['string_ids']));
36
  if ( is_array( $ids ) || is_array( $originals) ) {
37
  $trp = TRP_Translate_Press::get_trp_instance();
42
  $this->translation_manager = $trp->get_component('translation_manager');
43
  }
44
  $block_type = $this->trp_query->get_constant_block_type_regular_string();
45
+ $dictionaries = $this->get_translation_for_strings( $ids, $originals, $block_type, $skip_machine_translation );
46
 
47
  $localized_text = $this->translation_manager->string_groups();
48
  $string_group = __('Others', 'translatepress-multilingual'); // this type is not registered in the string types because it will be overwritten by the content in data-trp-node-type
66
  *
67
  * @return array
68
  */
69
+ protected function get_translation_for_strings( $ids, $originals, $block_type = null, $skip_machine_translation = array() ){
70
  $trp = TRP_Translate_Press::get_trp_instance();
71
  if ( ! $this->trp_query ) {
72
  $this->trp_query = $trp->get_component( 'query' );
109
  // necessary in order to obtain all the original strings
110
  if ( $this->settings['default-language'] != $current_language ) {
111
  if ( !empty ( $original_array ) && current_user_can ( apply_filters( 'trp_translating_capability', 'manage_options' ) ) ) {
112
+ $this->translation_render->process_strings($original_array, $current_language, $block_type, $skip_machine_translation);
113
  }
114
  $dictionaries[$current_language] = $this->trp_query->get_string_rows( $id_array, $original_array, $current_language );
115
  }else{
130
  $original_strings = $this->extract_original_strings($dictionaries[$current_language], $original_array, $id_array);
131
  }
132
  if (current_user_can(apply_filters( 'trp_translating_capability', 'manage_options' ))) {
133
+ $this->translation_render->process_strings($original_strings, $language, $block_type, $skip_machine_translation);
134
  }
135
  $dictionaries[$language] = $this->trp_query->get_string_rows(array(), $original_strings, $language);
136
  }
137
  }
138
 
139
+ if ( count( $skip_machine_translation ) > 0 ) {
140
+ foreach ( $dictionaries as $language => $dictionary ) {
141
+ if ( $language === $this->settings['default-language'] ) {
142
+ continue;
143
+ }
144
+ foreach ( $dictionary as $key => $string ) {
145
+ if ( $string->status == 1 && in_array( $string->original, $skip_machine_translation ) ) {
146
+ // do not return translation for href and src
147
+ $dictionaries[ $language ][ $key ]->translated = '';
148
+ $dictionaries[ $language ][ $key ]->status = 0;
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
  return $dictionaries;
155
  }
156
 
260
  $active_block_type = $this->trp_query->get_constant_block_type_active();
261
  foreach( $this->settings['translation-languages'] as $language ){
262
  if ( $language != $this->settings['default-language'] ){
263
+ $dictionaries = $this->get_translation_for_strings( array(), array( stripslashes( $_POST['original'] ) ), $active_block_type, array() );
264
  break;
265
  }
266
  }
includes/class-query.php CHANGED
@@ -63,7 +63,7 @@ class TRP_Query{
63
  }else {
64
  $and_block_type = " AND block_type = " . $block_type;
65
  }
66
- $query = "SELECT original,translated FROM `" . sanitize_text_field( $this->get_table_name( $language_code ) ) . "` WHERE status != " . self::NOT_TRANSLATED . $and_block_type . " AND original IN ";
67
 
68
  $placeholders = array();
69
  $values = array();
63
  }else {
64
  $and_block_type = " AND block_type = " . $block_type;
65
  }
66
+ $query = "SELECT original,translated, status FROM `" . sanitize_text_field( $this->get_table_name( $language_code ) ) . "` WHERE status != " . self::NOT_TRANSLATED . $and_block_type . " AND original IN ";
67
 
68
  $placeholders = array();
69
  $values = array();
includes/class-translation-render.php CHANGED
@@ -358,6 +358,7 @@ class TRP_Translation_Render{
358
  $no_translate_attribute = 'data-no-translation';
359
 
360
  $translateable_strings = array();
 
361
  $nodes = array();
362
 
363
  $trp = TRP_Translate_Press::get_trp_instance();
@@ -595,8 +596,12 @@ class TRP_Translation_Render{
595
  && !$this->has_ancestor_attribute( $row, $no_translate_attribute . '-' . $current_node_accessor_selector )
596
  && !$this->has_ancestor_class( $row, 'translation-block') )
597
  {
598
- array_push( $translateable_strings, html_entity_decode( $trimmed_string ) );
 
599
  array_push( $nodes, array( 'node'=>$row, 'type' => $node_accessor_key ) );
 
 
 
600
  }
601
  }
602
  }
@@ -607,7 +612,7 @@ class TRP_Translation_Render{
607
  $translateable_strings = $translateable_information['translateable_strings'];
608
  $nodes = $translateable_information['nodes'];
609
 
610
- $translated_strings = $this->process_strings( $translateable_strings, $language_code );
611
 
612
  do_action('trp_translateable_information', $translateable_information, $translated_strings, $language_code);
613
 
@@ -770,6 +775,20 @@ class TRP_Translation_Render{
770
 
771
  }
772
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
773
  /**
774
  * function that removes any unwanted leftover <trp-gettext> tags
775
  * @param $string
@@ -940,7 +959,7 @@ class TRP_Translation_Render{
940
  * @param $language_code
941
  * @return array
942
  */
943
- public function process_strings( $translateable_strings, $language_code, $block_type = null ){
944
  if ( ! $this->machine_translator ) {
945
  $trp = TRP_Translate_Press::get_trp_instance();
946
  $this->machine_translator = $trp->get_component('machine_translator');
@@ -962,14 +981,18 @@ class TRP_Translation_Render{
962
  $new_strings = array();
963
  $machine_translatable_strings = array();
964
  foreach( $translateable_strings as $i => $string ){
965
- //strings existing in database,
966
-
 
 
 
 
967
  if ( isset( $dictionary[$string]->translated ) ){
968
  $translated_strings[$i] = $dictionary[$string]->translated;
969
  }else{
970
  $new_strings[$i] = $translateable_strings[$i];
971
  // if the string is not a url then allow machine translation for it
972
- if ( $machine_translation_available && filter_var($new_strings[$i], FILTER_VALIDATE_URL) === false ){
973
  $machine_translatable_strings[$i] = $new_strings[$i];
974
  }
975
  }
@@ -1020,7 +1043,7 @@ class TRP_Translation_Render{
1020
  }
1021
 
1022
  $this->trp_query->insert_strings( $new_strings, $language_code, $block_type );
1023
- $this->trp_query->update_strings( $update_strings, $language_code );
1024
 
1025
  return $translated_strings;
1026
  }
@@ -1099,7 +1122,7 @@ class TRP_Translation_Render{
1099
  'attribute' => true
1100
  ),
1101
  'title' => array(
1102
- 'selector' => '[title]',
1103
  'accessor' => 'title',
1104
  'attribute' => true
1105
  ),
358
  $no_translate_attribute = 'data-no-translation';
359
 
360
  $translateable_strings = array();
361
+ $skip_machine_translating_strings = array();
362
  $nodes = array();
363
 
364
  $trp = TRP_Translate_Press::get_trp_instance();
596
  && !$this->has_ancestor_attribute( $row, $no_translate_attribute . '-' . $current_node_accessor_selector )
597
  && !$this->has_ancestor_class( $row, 'translation-block') )
598
  {
599
+ $entity_decoded_trimmed_string = html_entity_decode( $trimmed_string );
600
+ array_push( $translateable_strings, $entity_decoded_trimmed_string );
601
  array_push( $nodes, array( 'node'=>$row, 'type' => $node_accessor_key ) );
602
+ if ( ! apply_filters( 'trp_allow_machine_translation_for_string', true, $entity_decoded_trimmed_string, $current_node_accessor_selector, $node_accessor ) ){
603
+ array_push( $skip_machine_translating_strings, $entity_decoded_trimmed_string );
604
+ }
605
  }
606
  }
607
  }
612
  $translateable_strings = $translateable_information['translateable_strings'];
613
  $nodes = $translateable_information['nodes'];
614
 
615
+ $translated_strings = $this->process_strings( $translateable_strings, $language_code, null, $skip_machine_translating_strings );
616
 
617
  do_action('trp_translateable_information', $translateable_information, $translated_strings, $language_code);
618
 
775
 
776
  }
777
 
778
+ /*
779
+ * Do not translate src and href attributes
780
+ *
781
+ * Hooked to trp_allow_machine_translation_for_string
782
+ */
783
+ public function allow_machine_translation_for_string( $allow, $entity_decoded_trimmed_string, $current_node_accessor_selector, $node_accessor ){
784
+ $skip_attributes = apply_filters( 'trp_skip_machine_translation_for_attr', array( 'href', 'src' ) );
785
+ if ( in_array( $current_node_accessor_selector, $skip_attributes ) ){
786
+ // do not machine translate href and src
787
+ return false;
788
+ }
789
+ return $allow;
790
+ }
791
+
792
  /**
793
  * function that removes any unwanted leftover <trp-gettext> tags
794
  * @param $string
959
  * @param $language_code
960
  * @return array
961
  */
962
+ public function process_strings( $translateable_strings, $language_code, $block_type = null, $skip_machine_translating_strings = array() ){
963
  if ( ! $this->machine_translator ) {
964
  $trp = TRP_Translate_Press::get_trp_instance();
965
  $this->machine_translator = $trp->get_component('machine_translator');
981
  $new_strings = array();
982
  $machine_translatable_strings = array();
983
  foreach( $translateable_strings as $i => $string ){
984
+ // prevent accidentally machine translated strings from db such as for src to be displayed
985
+ $skip_string = in_array( $string, $skip_machine_translating_strings );
986
+ if ( isset( $dictionary[$string]->translated ) && $dictionary[$string]->status == $this->trp_query->get_constant_machine_translated() && $skip_string ){
987
+ continue;
988
+ }
989
+ //strings existing in database,
990
  if ( isset( $dictionary[$string]->translated ) ){
991
  $translated_strings[$i] = $dictionary[$string]->translated;
992
  }else{
993
  $new_strings[$i] = $translateable_strings[$i];
994
  // if the string is not a url then allow machine translation for it
995
+ if ( $machine_translation_available && !$skip_string && filter_var($new_strings[$i], FILTER_VALIDATE_URL) === false ){
996
  $machine_translatable_strings[$i] = $new_strings[$i];
997
  }
998
  }
1043
  }
1044
 
1045
  $this->trp_query->insert_strings( $new_strings, $language_code, $block_type );
1046
+ $this->trp_query->update_strings( $update_strings, $language_code, array( 'id','original', 'translated', 'status' ) );
1047
 
1048
  return $translated_strings;
1049
  }
1122
  'attribute' => true
1123
  ),
1124
  'title' => array(
1125
+ 'selector' => '[title]:not(link)',
1126
  'accessor' => 'title',
1127
  'attribute' => true
1128
  ),
includes/trp-ajax.php CHANGED
@@ -27,6 +27,7 @@ class TRP_Ajax{
27
 
28
  $this->output_translations(
29
  $this->sanitize_strings( $_POST['originals'] ),
 
30
  mysqli_real_escape_string( $this->connection, filter_var( $_POST['language'], FILTER_SANITIZE_STRING ) ),
31
  mysqli_real_escape_string( $this->connection, filter_var( $_POST['original_language'], FILTER_SANITIZE_STRING ) )
32
  );
@@ -143,18 +144,21 @@ class TRP_Ajax{
143
  * @param string $language Language to translate into.
144
  * @param string $original_language Language to translate from. Default language.
145
  */
146
- protected function output_translations( $strings, $language, $original_language ){
147
- $sql = 'SELECT original, translated FROM ' . $this->table_prefix . 'trp_dictionary_' . strtolower( $original_language ) . '_' . strtolower( $language ) . ' WHERE original IN (\'' . implode( "','", $strings ) .'\') AND status != 0';
148
  $result = mysqli_query( $this->connection, $sql );
149
  if ( $result === false ){
150
  $this->return_error();
151
  }else {
152
  $dictionaries[$language] = array();
153
  while ($row = mysqli_fetch_object($result)) {
 
 
 
 
154
  $dictionaries[$language][] = $row;
155
  }
156
 
157
- error_log(json_encode($dictionaries));
158
  $dictionary_by_original = trp_sort_dictionary_by_original( $dictionaries, 'regular', 'dynamicstrings', null, null );
159
  echo json_encode($dictionary_by_original);
160
  }
27
 
28
  $this->output_translations(
29
  $this->sanitize_strings( $_POST['originals'] ),
30
+ $this->sanitize_strings( $_POST['skip_machine_translation'] ),
31
  mysqli_real_escape_string( $this->connection, filter_var( $_POST['language'], FILTER_SANITIZE_STRING ) ),
32
  mysqli_real_escape_string( $this->connection, filter_var( $_POST['original_language'], FILTER_SANITIZE_STRING ) )
33
  );
144
  * @param string $language Language to translate into.
145
  * @param string $original_language Language to translate from. Default language.
146
  */
147
+ protected function output_translations( $strings, $skip_machine_translation, $language, $original_language ){
148
+ $sql = 'SELECT original, translated, status FROM ' . $this->table_prefix . 'trp_dictionary_' . strtolower( $original_language ) . '_' . strtolower( $language ) . ' WHERE original IN (\'' . implode( "','", $strings ) .'\') AND status != 0';
149
  $result = mysqli_query( $this->connection, $sql );
150
  if ( $result === false ){
151
  $this->return_error();
152
  }else {
153
  $dictionaries[$language] = array();
154
  while ($row = mysqli_fetch_object($result)) {
155
+ // do not retrieve a row that should not be machine translated ( ex. src, href )
156
+ if ( $row->status == 1 && in_array( $row->original, $skip_machine_translation ) ) {
157
+ continue;
158
+ }
159
  $dictionaries[$language][] = $row;
160
  }
161
 
 
162
  $dictionary_by_original = trp_sort_dictionary_by_original( $dictionaries, 'regular', 'dynamicstrings', null, null );
163
  echo json_encode($dictionary_by_original);
164
  }
index.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: TranslatePress - Multilingual
4
  Plugin URI: https://translatepress.com/
5
  Description: Experience a better way of translating your WordPress site, with full support for WooCommerce and site builders.
6
- Version: 1.4.8
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
3
  Plugin Name: TranslatePress - Multilingual
4
  Plugin URI: https://translatepress.com/
5
  Description: Experience a better way of translating your WordPress site, with full support for WooCommerce and site builders.
6
+ Version: 1.4.9
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
partials/translation-manager.php CHANGED
@@ -47,6 +47,12 @@
47
 
48
  $view_as_roles = apply_filters( 'trp_view_as_values', $view_as_roles );
49
  $string_groups = apply_filters( 'trp_string_group_order', array_values( $translation_manager->string_groups() ) );
 
 
 
 
 
 
50
  ?>
51
 
52
  <title>TranslatePress</title>
@@ -71,7 +77,7 @@
71
  merge_rules='<?php echo esc_attr( json_encode( $translation_manager->get_merge_rules() ) ); ?>'
72
  localized_text='<?php echo esc_attr( json_encode( $translation_manager->localized_text() ) ); ?>'
73
  paid_version="<?php echo esc_attr( trp_is_paid_version() ? 'true' : 'false' ); ?>"
74
- flags_path="<?php echo esc_url( apply_filters( 'trp_flags_path', TRP_PLUGIN_URL .'assets/images/flags/' ) ); ?>"
75
  >
76
  </trp-editor>
77
  </div>
47
 
48
  $view_as_roles = apply_filters( 'trp_view_as_values', $view_as_roles );
49
  $string_groups = apply_filters( 'trp_string_group_order', array_values( $translation_manager->string_groups() ) );
50
+
51
+ $flags_path = array();
52
+ foreach( $trp_settings['translation-languages'] as $language_code ) {
53
+ $default_path = TRP_PLUGIN_URL . 'assets/images/flags/';
54
+ $flags_path[$language_code] = apply_filters( 'trp_flags_path', $default_path, $language_code );
55
+ }
56
  ?>
57
 
58
  <title>TranslatePress</title>
77
  merge_rules='<?php echo esc_attr( json_encode( $translation_manager->get_merge_rules() ) ); ?>'
78
  localized_text='<?php echo esc_attr( json_encode( $translation_manager->localized_text() ) ); ?>'
79
  paid_version="<?php echo esc_attr( trp_is_paid_version() ? 'true' : 'false' ); ?>"
80
+ flags_path="<?php echo esc_attr( json_encode( $flags_path ) ); ?>"
81
  >
82
  </trp-editor>
83
  </div>
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: translate, translation, multilingual, automatic translation, bilingual, fr
5
  Requires at least: 3.1.0
6
  Tested up to: 5.2.1
7
  Requires PHP: 5.6.20
8
- Stable tag: 1.4.8
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -126,6 +126,11 @@ For more information please check out [TranslatePress - Multilingual plugin docu
126
  6. Menu Language Switcher
127
 
128
  == Changelog ==
 
 
 
 
 
129
  = 1.4.8 =
130
  * Added support for translating images
131
  * Added support for translating title attribute
5
  Requires at least: 3.1.0
6
  Tested up to: 5.2.1
7
  Requires PHP: 5.6.20
8
+ Stable tag: 1.4.9
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
126
  6. Menu Language Switcher
127
 
128
  == Changelog ==
129
+ = 1.4.9 =
130
+ * Fixed incompatibility with custom code for changing flags
131
+ * Fixed some pages not being translated due to incorrectly encoded character
132
+ * Fixed some images missing when automatic translation is on
133
+
134
  = 1.4.8 =
135
  * Added support for translating images
136
  * Added support for translating title attribute