@algoux/standard-ranklist-renderer-component-angular 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, } from '@angular/core';
|
|
3
3
|
import { EnumTheme, formatTimeDuration, numberToAlphabet, resolveStyle, resolveText, resolveUserMarkers, } from '@algoux/standard-ranklist-utils';
|
|
4
|
-
import { calculateDirtPercentage, calculateProblemStatisticsFooter, calculateSEValue, caniuse, formatProblemStatisticsAcceptedMinute, formatProblemStatisticsAverageHardness, formatProblemStatisticsPercent, getMarkerPresentation,
|
|
4
|
+
import { calculateDirtPercentage, calculateProblemStatisticsFooter, calculateSEValue, caniuse, formatProblemStatisticsAcceptedMinute, formatProblemStatisticsAverageHardness, formatProblemStatisticsPercent, getMarkerPresentation, getProblemHeaderBackgroundImageIfStyled, getRankProblemStatusCellClassName, getRankProblemStatusCellPresentation, resolveSrkAssetUrl, shouldShowTimeColumn, srkSupportedVersions, } from '@algoux/standard-ranklist-renderer-component-core';
|
|
5
5
|
import { captureModalTriggerPointFromMouseEvent } from '../modal/modal-interactions';
|
|
6
6
|
import { SrkProblemHeaderCellTemplateDirective, } from './problem-header-cell-template.directive';
|
|
7
7
|
import { SrkStatusCellTemplateDirective, } from './status-cell-template.directive';
|
|
@@ -125,7 +125,7 @@ export class RanklistComponent {
|
|
|
125
125
|
return `${statistics.accepted} / ${statistics.submitted} (${ratio}%)`;
|
|
126
126
|
}
|
|
127
127
|
problemHeaderBackgroundImage(problem, gradientDirection = 180) {
|
|
128
|
-
return
|
|
128
|
+
return getProblemHeaderBackgroundImageIfStyled(problem.style, this.theme, gradientDirection);
|
|
129
129
|
}
|
|
130
130
|
resolvedUserMarkers(user) {
|
|
131
131
|
return resolveUserMarkers(user, this.data.markers).map((marker) => ({
|
|
@@ -162,17 +162,9 @@ export class RanklistComponent {
|
|
|
162
162
|
if (this.statusColorAsText) {
|
|
163
163
|
classNames.push('srk-prest-status-block-color-text');
|
|
164
164
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
else if (status.result === 'AC') {
|
|
169
|
-
classNames.push('srk-prest-status-block-accepted');
|
|
170
|
-
}
|
|
171
|
-
else if (status.result === '?') {
|
|
172
|
-
classNames.push('srk-prest-status-block-frozen');
|
|
173
|
-
}
|
|
174
|
-
else if (status.result === 'RJ') {
|
|
175
|
-
classNames.push('srk-prest-status-block-failed');
|
|
165
|
+
const resultClassName = getRankProblemStatusCellClassName(status, this.data);
|
|
166
|
+
if (resultClassName) {
|
|
167
|
+
classNames.push(resultClassName);
|
|
176
168
|
}
|
|
177
169
|
return classNames.join(' ');
|
|
178
170
|
}
|
|
@@ -590,9 +582,13 @@ export class RanklistComponent {
|
|
|
590
582
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
591
583
|
<ng-container *ngIf="isNumber(presentation.score); else statusText">
|
|
592
584
|
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
593
|
-
<
|
|
594
|
-
|
|
595
|
-
|
|
585
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
586
|
+
<span [textContent]="statusSeparator"></span>
|
|
587
|
+
<span
|
|
588
|
+
class="srk-prest-status-block-score-details"
|
|
589
|
+
[textContent]="presentation.scoreDetails"
|
|
590
|
+
></span>
|
|
591
|
+
</ng-container>
|
|
596
592
|
</ng-container>
|
|
597
593
|
<ng-template #statusText>
|
|
598
594
|
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
@@ -615,12 +611,24 @@ export class RanklistComponent {
|
|
|
615
611
|
(keydown.space)="activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)"
|
|
616
612
|
>
|
|
617
613
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
618
|
-
<ng-container *ngIf="presentation.
|
|
619
|
-
<span class="srk-prest-status-block-
|
|
620
|
-
<
|
|
621
|
-
|
|
614
|
+
<ng-container *ngIf="isNumber(presentation.score); else failedStatusText">
|
|
615
|
+
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
616
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
617
|
+
<span [textContent]="statusSeparator"></span>
|
|
618
|
+
<span
|
|
619
|
+
class="srk-prest-status-block-score-details"
|
|
620
|
+
[textContent]="presentation.scoreDetails"
|
|
621
|
+
></span>
|
|
622
|
+
</ng-container>
|
|
622
623
|
</ng-container>
|
|
623
|
-
<ng-template #
|
|
624
|
+
<ng-template #failedStatusText>
|
|
625
|
+
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
626
|
+
<span class="srk-prest-status-block-primary">{{ presentation.primary || '' }}</span>
|
|
627
|
+
<span [textContent]="statusSeparator"></span>
|
|
628
|
+
<span class="srk-prest-status-block-secondary">{{ presentation.secondary }}</span>
|
|
629
|
+
</ng-container>
|
|
630
|
+
<ng-template #singleStatus>{{ presentation.primary }}</ng-template>
|
|
631
|
+
</ng-template>
|
|
624
632
|
</ng-container>
|
|
625
633
|
</td>
|
|
626
634
|
</ng-template>
|
|
@@ -930,9 +938,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
930
938
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
931
939
|
<ng-container *ngIf="isNumber(presentation.score); else statusText">
|
|
932
940
|
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
933
|
-
<
|
|
934
|
-
|
|
935
|
-
|
|
941
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
942
|
+
<span [textContent]="statusSeparator"></span>
|
|
943
|
+
<span
|
|
944
|
+
class="srk-prest-status-block-score-details"
|
|
945
|
+
[textContent]="presentation.scoreDetails"
|
|
946
|
+
></span>
|
|
947
|
+
</ng-container>
|
|
936
948
|
</ng-container>
|
|
937
949
|
<ng-template #statusText>
|
|
938
950
|
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
@@ -955,12 +967,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
955
967
|
(keydown.space)="activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)"
|
|
956
968
|
>
|
|
957
969
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
958
|
-
<ng-container *ngIf="presentation.
|
|
959
|
-
<span class="srk-prest-status-block-
|
|
960
|
-
<
|
|
961
|
-
|
|
970
|
+
<ng-container *ngIf="isNumber(presentation.score); else failedStatusText">
|
|
971
|
+
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
972
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
973
|
+
<span [textContent]="statusSeparator"></span>
|
|
974
|
+
<span
|
|
975
|
+
class="srk-prest-status-block-score-details"
|
|
976
|
+
[textContent]="presentation.scoreDetails"
|
|
977
|
+
></span>
|
|
978
|
+
</ng-container>
|
|
962
979
|
</ng-container>
|
|
963
|
-
<ng-template #
|
|
980
|
+
<ng-template #failedStatusText>
|
|
981
|
+
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
982
|
+
<span class="srk-prest-status-block-primary">{{ presentation.primary || '' }}</span>
|
|
983
|
+
<span [textContent]="statusSeparator"></span>
|
|
984
|
+
<span class="srk-prest-status-block-secondary">{{ presentation.secondary }}</span>
|
|
985
|
+
</ng-container>
|
|
986
|
+
<ng-template #singleStatus>{{ presentation.primary }}</ng-template>
|
|
987
|
+
</ng-template>
|
|
964
988
|
</ng-container>
|
|
965
989
|
</td>
|
|
966
990
|
</ng-template>
|
|
@@ -1103,4 +1127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1103
1127
|
type: ContentChild,
|
|
1104
1128
|
args: [SrkUserCellTemplateDirective]
|
|
1105
1129
|
}] } });
|
|
1106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFua2xpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yYW5rbGlzdC9yYW5rbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFdBQVcsRUFDWCxrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdDQUFnQyxFQUNoQyxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHFDQUFxQyxFQUNyQyxzQ0FBc0MsRUFDdEMsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQiwrQkFBK0IsRUFDL0Isb0NBQW9DLEVBQ3BDLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0sbURBQW1ELENBQUM7QUFPM0QsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFTckYsT0FBTyxFQUNMLHFDQUFxQyxHQUV0QyxNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFDTCw4QkFBOEIsR0FFL0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsNEJBQTRCLEdBRTdCLE1BQU0sZ0NBQWdDLENBQUM7OztBQW9WeEMsTUFBTSxPQUFPLGlCQUFpQjtJQUNELElBQUksQ0FBa0I7SUFDeEMsS0FBSyxHQUFjLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDbkMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsaUJBQWlCLENBQTBDO0lBQzNELGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixZQUFZLENBQXdCO0lBQ3BDLGdCQUFnQixHQUE2QixTQUFTLENBQUM7SUFDdkQsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLDJCQUEyQixHQUFHLEtBQUssQ0FBQztJQUNwQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsc0JBQXNCLEdBQWtCLElBQUksQ0FBQztJQUM3QyxtQkFBbUIsR0FBZ0MsTUFBTSxDQUFDO0lBQzFELFNBQVMsQ0FBcUI7SUFFN0IsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBQ2pELFlBQVksR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztJQUN2RCxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7SUFHbkUseUJBQXlCLENBQXlDO0lBR2xFLGtCQUFrQixDQUFrQztJQUdwRCxnQkFBZ0IsQ0FBZ0M7SUFFdkMsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7SUFDekMsY0FBYyxHQUFHLFFBQVEsQ0FBQztJQUMxQixlQUFlLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLDJCQUEyQixHQUFHO1FBQ3JDO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixLQUFLLEVBQUUsVUFBVTtZQUNqQixPQUFPLEVBQUUsZ0RBQWdEO1NBQzFEO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixLQUFLLEVBQUUsV0FBVztZQUNsQixPQUFPLEVBQUUsbURBQW1EO1NBQzdEO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixLQUFLLEVBQUUsV0FBVztZQUNsQixPQUFPLEVBQUUsb0RBQW9EO1NBQzlEO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsTUFBTTtZQUNYLEtBQUssRUFBRSxNQUFNO1lBQ2IsT0FBTyxFQUFFLDhEQUE4RDtTQUN4RTtRQUNEO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxLQUFLLEVBQUUsSUFBSTtZQUNYLE9BQU8sRUFBRSwwRUFBMEU7U0FDcEY7UUFDRDtZQUNFLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLDREQUE0RDtTQUN0RTtRQUNEO1lBQ0UsR0FBRyxFQUFFLGNBQWM7WUFDbkIsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsMERBQTBEO1NBQ3BFO0tBQ0YsQ0FBQztJQUNNLHVCQUF1QixDQUFrQjtJQUN6QyxzQkFBc0IsQ0FBNkI7SUFFM0QsSUFBSSxpQkFBaUI7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0UsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLGNBQWMsQ0FBQztJQUMvRSxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFzQjtRQUNsQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFvQixFQUFFLEdBQXNCO1FBQ3RELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRixDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBdUM7UUFDeEQsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBc0IsRUFBRSxLQUFhO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQy9DLElBQUksT0FBTyxZQUFZLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDdkMsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsR0FBa0QsRUFBRSxRQUFnQjtRQUNyRixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDOUMsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFvQixFQUFFLFlBQW9CO1FBQ3JELE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBaUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sR0FBRyxVQUFVLENBQUMsUUFBUSxNQUFNLFVBQVUsQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDeEUsQ0FBQztJQUVELDRCQUE0QixDQUFDLE9BQW9CLEVBQUUsaUJBQWlCLEdBQUcsR0FBRztRQUN4RSxPQUFPLCtCQUErQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFjO1FBQ2hDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE1BQU07WUFDTixZQUFZLEVBQUUscUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ3ZDLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQThDO1FBQ3ZELE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHVCQUF1QixDQUFDLEdBQXNCO1FBQzVDLE9BQU8sdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQXNCLEVBQUUsaUJBQTRDO1FBQ25GLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQTZCO1FBQzlDLE9BQU8sb0NBQW9DLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFjO1FBQ3JCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUE2QjtRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQTZCO1FBQzNDLE1BQU0sVUFBVSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsVUFBVSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0IsVUFBVSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQTZCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUE2QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUQsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQTZCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUdwQixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUQsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsT0FBb0IsRUFBRSxZQUFvQjtRQUN0RSxPQUFPO1lBQ0wsU0FBUyxFQUFFLE9BQU87WUFDbEIsT0FBTztZQUNQLFlBQVk7WUFDWixLQUFLLEVBQUUsWUFBWTtZQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztTQUNyRixDQUFDO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUFDLEdBQXNCLEVBQUUsUUFBZ0I7UUFDM0QsT0FBTztZQUNMLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxHQUFHO1lBQ0gsUUFBUTtZQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQzFCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDeEMsVUFBVSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUMzQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsT0FBTyxFQUFFLENBQUMsS0FBa0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQztTQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVELHNCQUFzQixDQUNwQixHQUFzQixFQUN0QixRQUFnQixFQUNoQixNQUE2QixFQUM3QixZQUFvQjtRQUVwQixPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU07WUFDakIsTUFBTTtZQUNOLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDekMsWUFBWTtZQUNaLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEdBQUc7WUFDSCxRQUFRO1lBQ1IsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1lBQzFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ25ELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQztTQUNwRyxDQUFDO0lBQ0osQ0FBQztJQUVELDRCQUE0QixDQUFDLEtBQVksRUFBRSxHQUFzQixFQUFFLFFBQWdCO1FBQ2pGLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGlDQUFpQyxDQUFDLEtBQVksRUFBRSxPQUFvQixFQUFFLFlBQW9CO1FBQ3hGLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCw4QkFBOEIsQ0FDNUIsS0FBWSxFQUNaLEdBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLE1BQTZCLEVBQzdCLFlBQW9CO1FBRXBCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBNkIsRUFBRSxHQUFzQixFQUFFLFFBQWdCO1FBQ25GLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixzQ0FBc0MsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVDLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixPQUFPLEVBQUU7b0JBQ1AsUUFBUTtvQkFDUixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSTtvQkFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDakQ7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsR0FBRztZQUNILFFBQVE7WUFDUixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQTZCLEVBQUUsT0FBb0IsRUFBRSxZQUFvQjtRQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztZQUNwQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsc0NBQXNDLENBQUMsS0FBSyxFQUFFO2dCQUM1QyxNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixPQUFPLEVBQUU7b0JBQ1AsWUFBWTtvQkFDWixZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJO29CQUNuQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJO2lCQUM3RDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixPQUFPO1lBQ1AsWUFBWTtZQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQ2YsS0FBNkIsRUFDN0IsR0FBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsTUFBNkIsRUFDN0IsWUFBb0I7UUFFcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1Ysc0NBQXNDLENBQUMsS0FBSyxFQUFFO2dCQUM1QyxNQUFNLEVBQUUsYUFBYTtnQkFDckIsT0FBTyxFQUFFO29CQUNQLFFBQVE7b0JBQ1IsWUFBWTtvQkFDWixZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUk7b0JBQzdELFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUN2SCxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSTtpQkFDNUI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsR0FBRztZQUNILFFBQVE7WUFDUixZQUFZO1lBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUN6QyxNQUFNO1lBQ04sU0FBUztZQUNULFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBb0IsRUFBRSxNQUFrQztRQUNuRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVELHVCQUF1QixDQUFDLE1BQWtDO1FBQ3hELE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxTQUFvQixFQUFFLE1BQWtDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hFLE9BQU8sT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3RixDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBb0IsRUFBRSxNQUFrQztRQUM1RSxNQUFNLFVBQVUsR0FBZTtZQUM3QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTO1lBQzVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7U0FDNUIsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDO1FBQ2hELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLElBQUksVUFBVSxDQUFDO1FBQzVELE9BQU87WUFDTCxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDNUIsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQscUNBQXFDLENBQUMsR0FBVyxFQUFFLElBQTZCO1FBQzlFLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDWixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssV0FBVztnQkFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN4QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CLEtBQUssSUFBSTtnQkFDUCxPQUFPLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELEtBQUssZUFBZTtnQkFDbEIsT0FBTyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN2RSxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8scUNBQXFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdEU7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELHVDQUF1QyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNoRixRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNiLE9BQU8sOEJBQThCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM5RSxLQUFLLFdBQVc7Z0JBQ2QsT0FBTyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9FLEtBQUssTUFBTTtnQkFDVCxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZFO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO3dHQXZiVSxpQkFBaUI7NEZBQWpCLGlCQUFpQixreEJBc0JkLHFDQUFxQyxxRkFHckMsOEJBQThCLG1GQUc5Qiw0QkFBNEIsZ0RBeldoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJVVCwyREE1VVMsWUFBWTs7NEZBOFVYLGlCQUFpQjtrQkFsVjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyVVQ7aUJBQ0Y7OEJBRTRCLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBR1AseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLHFDQUFxQztnQkFJbkQsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFJNUMsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBzcmsgZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRW51bVRoZW1lLFxuICBmb3JtYXRUaW1lRHVyYXRpb24sXG4gIG51bWJlclRvQWxwaGFiZXQsXG4gIHJlc29sdmVTdHlsZSxcbiAgcmVzb2x2ZVRleHQsXG4gIHJlc29sdmVVc2VyTWFya2Vycyxcbn0gZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdC11dGlscyc7XG5pbXBvcnQgdHlwZSB7IFRoZW1lQ29sb3IgfSBmcm9tICdAYWxnb3V4L3N0YW5kYXJkLXJhbmtsaXN0LXV0aWxzJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZURpcnRQZXJjZW50YWdlLFxuICBjYWxjdWxhdGVQcm9ibGVtU3RhdGlzdGljc0Zvb3RlcixcbiAgY2FsY3VsYXRlU0VWYWx1ZSxcbiAgY2FuaXVzZSxcbiAgZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NBY2NlcHRlZE1pbnV0ZSxcbiAgZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NBdmVyYWdlSGFyZG5lc3MsXG4gIGZvcm1hdFByb2JsZW1TdGF0aXN0aWNzUGVyY2VudCxcbiAgZ2V0TWFya2VyUHJlc2VudGF0aW9uLFxuICBnZXRQcm9ibGVtSGVhZGVyQmFja2dyb3VuZEltYWdlLFxuICBnZXRSYW5rUHJvYmxlbVN0YXR1c0NlbGxQcmVzZW50YXRpb24sXG4gIHJlc29sdmVTcmtBc3NldFVybCxcbiAgc2hvdWxkU2hvd1RpbWVDb2x1bW4sXG4gIHNya1N1cHBvcnRlZFZlcnNpb25zLFxufSBmcm9tICdAYWxnb3V4L3N0YW5kYXJkLXJhbmtsaXN0LXJlbmRlcmVyLWNvbXBvbmVudC1jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvYmxlbVN0YXRpc3RpY3NGb290ZXIsXG4gIFJhbmtsaXN0Q29sdW1uVGl0bGVzLFxuICBSYW5rbGlzdFN0YXR1c0NlbGxQcmVzZXQsXG4gIFJhbmtsaXN0VXNlckF2YXRhclBsYWNlbWVudCxcbn0gZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdC1yZW5kZXJlci1jb21wb25lbnQtY29yZSc7XG5pbXBvcnQgeyBjYXB0dXJlTW9kYWxUcmlnZ2VyUG9pbnRGcm9tTW91c2VFdmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7XG4gIFByb2JsZW1DbGlja1BheWxvYWQsXG4gIFJhbmtWYWx1ZSxcbiAgU29sdXRpb25DbGlja1BheWxvYWQsXG4gIFN0YXRpY1JhbmtsaXN0LFxuICBTdGF0aWNSYW5rbGlzdFJvdyxcbiAgVXNlckNsaWNrUGF5bG9hZCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgU3JrUHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgdHlwZSBQcm9ibGVtSGVhZGVyQ2VsbFRlbXBsYXRlQ29udGV4dCxcbn0gZnJvbSAnLi9wcm9ibGVtLWhlYWRlci1jZWxsLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBTcmtTdGF0dXNDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gIHR5cGUgU3RhdHVzQ2VsbFRlbXBsYXRlQ29udGV4dCxcbn0gZnJvbSAnLi9zdGF0dXMtY2VsbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgU3JrVXNlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgdHlwZSBVc2VyQ2VsbFRlbXBsYXRlQ29udGV4dCxcbn0gZnJvbSAnLi91c2VyLWNlbGwtdGVtcGxhdGUuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3JrLXJhbmtsaXN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgKm5nSWY9XCJkYXRhLnR5cGUgIT09ICdnZW5lcmFsJzsgZWxzZSB2ZXJzaW9uU3RhdGVcIj5cbiAgICAgIHNyayB0eXBlIFwie3sgZGF0YS50eXBlIH19XCIgaXMgbm90IHN1cHBvcnRlZFxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICN2ZXJzaW9uU3RhdGU+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3VwcG9ydGVkVmVyc2lvbigpOyBlbHNlIHJhbmtsaXN0VGFibGVcIj5cbiAgICAgICAgc3JrIHZlcnNpb24gXCJ7eyBkYXRhLnZlcnNpb24gfX1cIiBpcyBub3Qgc3VwcG9ydGVkIChjdXJyZW50IHN1cHBvcnRlZDoge3sgc3VwcG9ydGVkVmVyc2lvbnMgfX0pXG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNyYW5rbGlzdFRhYmxlPlxuICAgICAgPGRpdiBjbGFzcz1cInNyay1jb21tb24tdGFibGUgc3JrLW1haW5cIj5cbiAgICAgICAgPHRhYmxlXG4gICAgICAgICAgW2NsYXNzLnNyay10YWJsZS1yb3ctYm9yZGVyZWRdPVwicm93Qm9yZGVyZWRcIlxuICAgICAgICAgIFtjbGFzcy5zcmstdGFibGUtY29sdW1uLWJvcmRlcmVkXT1cImNvbHVtbkJvcmRlcmVkXCJcbiAgICAgICAgICBbY2xhc3Muc3JrLXRhYmxlLXJvdy1zdHJpcGVkXT1cInJvd1N0cmlwZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VyaWVzSXRlbSBvZiBkYXRhLnNlcmllczsgbGV0IHNlcmllc0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXNlcmllcy1oZWFkZXIgc3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3JrLXNlcmllcy1zZWdtZW50ZWQtY29sdW1uXT1cImlzU2VyaWVzU2VnbWVudGVkQ29sdW1uKHNlcmllc0l0ZW0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHJlc29sdmVTZXJpZXNDb2x1bW5UaXRsZShzZXJpZXNJdGVtLCBzZXJpZXNJbmRleCkgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzcGxpdE9yZ2FuaXphdGlvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstb3JnYW5pemF0aW9uLWhlYWRlciBzcmstLXRleHQtbGVmdCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyByZXNvbHZlQ29sdW1uVGl0bGUoJ29yZ2FuaXphdGlvbicsICdPcmdhbml6YXRpb24nKSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzcmstLXRleHQtbGVmdCBzcmstLW5vd3JhcFwiPnt7IHJlc29sdmVDb2x1bW5UaXRsZSgndXNlcicsICdOYW1lJykgfX08L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIj57eyByZXNvbHZlQ29sdW1uVGl0bGUoJ3Njb3JlJywgJ1Njb3JlJykgfX08L3RoPlxuICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzaG93VGltZUNvbHVtbigpXCIgY2xhc3M9XCJzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICB7eyByZXNvbHZlQ29sdW1uVGl0bGUoJ3RpbWUnLCAnVGltZScpIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvYmxlbSBvZiBkYXRhLnByb2JsZW1zOyBsZXQgcHJvYmxlbUluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb2JsZW1IZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdFByb2JsZW1IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJidWlsZFByb2JsZW1IZWFkZXJDZWxsQ29udGV4dChwcm9ibGVtLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UHJvYmxlbUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay0tbm93cmFwIHNyay1wcm9ibGVtLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zcmstLWN1cnNvci1wb2ludGVyXT1cImhhc1Byb2JsZW1DbGlja0xpc3RlbmVyKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInByb2JsZW1IZWFkZXJSb2xlKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJwcm9ibGVtSGVhZGVyVGFiSW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cInByb2JsZW1IZWFkZXJCYWNrZ3JvdW5kSW1hZ2UocHJvYmxlbSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW1pdFByb2JsZW1DbGljaygkZXZlbnQsIHByb2JsZW0sIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhY3RpdmF0ZVByb2JsZW1IZWFkZXJGcm9tS2V5Ym9hcmQoJGV2ZW50LCBwcm9ibGVtLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiYWN0aXZhdGVQcm9ibGVtSGVhZGVyRnJvbUtleWJvYXJkKCRldmVudCwgcHJvYmxlbSwgcHJvYmxlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9ibGVtLmxpbmsgJiYgIWhhc1Byb2JsZW1DbGlja0xpc3RlbmVyKCk7IGVsc2UgdW5saW5rZWRQcm9ibGVtSGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJwcm9ibGVtLmxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdW5zZXRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstLWRpc3BsYXktYmxvY2tcIj57eyBwcm9ibGVtQWxpYXMocHJvYmxlbSwgcHJvYmxlbUluZGV4KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9ibGVtLnN0YXRpc3RpY3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstLWRpc3BsYXktYmxvY2sgc3JrLXByb2JsZW0tc3RhdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInByb2JsZW1TdGF0c1RpdGxlKHByb2JsZW0uc3RhdGlzdGljcylcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHByb2JsZW0uc3RhdGlzdGljcy5hY2NlcHRlZCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3VubGlua2VkUHJvYmxlbUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay0tZGlzcGxheS1ibG9ja1wiPnt7IHByb2JsZW1BbGlhcyhwcm9ibGVtLCBwcm9ibGVtSW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2JsZW0uc3RhdGlzdGljc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay0tZGlzcGxheS1ibG9jayBzcmstcHJvYmxlbS1zdGF0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicHJvYmxlbVN0YXRzVGl0bGUocHJvYmxlbS5zdGF0aXN0aWNzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJvYmxlbS5zdGF0aXN0aWNzLmFjY2VwdGVkIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2hvd0RpcnRDb2x1bW5cIiBjbGFzcz1cInNyay1kaXJ0LWhlYWRlciBzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICB7eyByZXNvbHZlQ29sdW1uVGl0bGUoJ2RpcnQnLCAnRGlydCcpIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNob3dTRUNvbHVtblwiIGNsYXNzPVwic3JrLXNlLWhlYWRlciBzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICB7eyByZXNvbHZlQ29sdW1uVGl0bGUoJ3NlJywgJ1NFJykgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXRhLnJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByYW5rVmFsdWUgb2YgZ2V0UmFua1ZhbHVlcyhyb3cpOyBsZXQgc2VyaWVzSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFNlcmllc1NlZ21lbnRDbGFzcyhyYW5rVmFsdWUsIGRhdGEuc2VyaWVzW3Nlcmllc0luZGV4XSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zcmstc2VyaWVzLXNlZ21lbnRlZC1jb2x1bW5dPVwiaXNTZXJpZXNTZWdtZW50ZWRDb2x1bW4oZGF0YS5zZXJpZXNbc2VyaWVzSW5kZXhdKVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U2VyaWVzU2VnbWVudFN0eWxlKHJhbmtWYWx1ZSwgZGF0YS5zZXJpZXNbc2VyaWVzSW5kZXhdKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBnZXRSYW5rVGV4dChyYW5rVmFsdWUsIHJvdykgfX1cbiAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNwbGl0T3JnYW5pemF0aW9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1vcmdhbml6YXRpb24tY2VsbCBzcmstLXRleHQtbGVmdCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNyay1vcmdhbml6YXRpb24tY2VsbC1hdmF0YXJdPVwic2hvd0F2YXRhckluT3JnYW5pemF0aW9uKCkgJiYgISFyb3cudXNlci5hdmF0YXJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNyay1vcmdhbml6YXRpb24tY2VsbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0F2YXRhckluT3JnYW5pemF0aW9uKCkgJiYgcm93LnVzZXIuYXZhdGFyXCIgY2xhc3M9XCJzcmstdXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZm9ybWF0QXNzZXRVcmwocm93LnVzZXIuYXZhdGFyLCAndXNlci5hdmF0YXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVXNlciBBdmF0YXJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1vcmdhbml6YXRpb24tbmFtZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInJvdy51c2VyLm9yZ2FuaXphdGlvbiA/IHJlc29sdmVEaXNwbGF5VGV4dChyb3cudXNlci5vcmdhbml6YXRpb24pIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwicm93LnVzZXIub3JnYW5pemF0aW9uID8gcmVzb2x2ZURpc3BsYXlUZXh0KHJvdy51c2VyLm9yZ2FuaXphdGlvbikgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyQ2VsbFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRVc2VyQ2VsbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInVzZXJDZWxsVGVtcGxhdGUudGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImJ1aWxkVXNlckNlbGxDb250ZXh0KHJvdywgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VXNlckNlbGw+XG4gICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay0tdGV4dC1sZWZ0IHNyay0tbm93cmFwIHNyay11c2VyLWNlbGwgc3JrLS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW1pdFVzZXJDbGljaygkZXZlbnQsIHJvdywgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFjdGl2YXRlVXNlckNlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZVVzZXJDZWxsRnJvbUtleWJvYXJkKCRldmVudCwgcm93LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcmstdXNlci1jZWxsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy51c2VyLmF2YXRhciAmJiAhc2hvd0F2YXRhckluT3JnYW5pemF0aW9uKClcIiBjbGFzcz1cInNyay11c2VyLWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZm9ybWF0QXNzZXRVcmwocm93LnVzZXIuYXZhdGFyLCAndXNlci5hdmF0YXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJVc2VyIEF2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcmstdXNlci1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNyay11c2VyLW5hbWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay11c2VyLW5hbWUtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyZXNvbHZlRGlzcGxheVRleHQocm93LnVzZXIubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXNvbHZlRGlzcGxheVRleHQocm93LnVzZXIubmFtZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLW1hcmtlci1kb3QtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbWFya2VyIG9mIHJlc29sdmVkVXNlck1hcmtlcnMocm93LnVzZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1tYXJrZXIgc3JrLW1hcmtlci1kb3Qgc3JrLS1jLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1hcmtlci5wcmVzZW50YXRpb24uY2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJtYXJrZXIucHJlc2VudGF0aW9uLnN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwicmVzb2x2ZURpc3BsYXlUZXh0KG1hcmtlci5tYXJrZXIubGFiZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cudXNlci5vcmdhbml6YXRpb24gJiYgIXNwbGl0T3JnYW5pemF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXVzZXItc2Vjb25kYXJ5LXRleHQgc3JrLS10ZXh0LWVsbGlwc2lzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByZXNvbHZlRGlzcGxheVRleHQocm93LnVzZXIub3JnYW5pemF0aW9uKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPnt7IHJvdy5zY29yZS52YWx1ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInNob3dUaW1lQ29sdW1uKClcIiBjbGFzcz1cInNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IHJvdy5zY29yZS50aW1lID8gZm9ybWF0VGltZShyb3cuc2NvcmUudGltZSkgOiAnLScgfX1cbiAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGF0dXMgb2Ygcm93LnN0YXR1c2VzOyBsZXQgcHJvYmxlbUluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhdHVzQ2VsbFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRTdGF0dXNDZWxsXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0YXR1c0NlbGxUZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJidWlsZFN0YXR1c0NlbGxDb250ZXh0KHJvdywgcm93SW5kZXgsIHN0YXR1cywgcHJvYmxlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN0YXR1c0NlbGw+XG4gICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXMucmVzdWx0ID09PSAnRkInIHx8IHN0YXR1cy5yZXN1bHQgPT09ICdBQyc7IGVsc2UgZmFpbGVkT3JGcm96ZW5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzdGF0dXNDZWxsQ2xhc3Moc3RhdHVzKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwic3RhdHVzQ2VsbFJvbGUoc3RhdHVzKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInN0YXR1c0NlbGxUYWJJbmRleChzdGF0dXMpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVtaXRTb2x1dGlvbkNsaWNrKCRldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGVTdGF0dXNDZWxsRnJvbUtleWJvYXJkKCRldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiYWN0aXZhdGVTdGF0dXNDZWxsRnJvbUtleWJvYXJkKCRldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c0NvbG9yQXNUZXh0ICYmIHN0YXR1cy5yZXN1bHQgPT09ICdGQidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByZXN0LXN0YXR1cy1ibG9jay1mYi1zdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwiZmlyc3RCbG9vZFN0YXJcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhdHVzUHJlc2VudGF0aW9uKHN0YXR1cykgYXMgcHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTnVtYmVyKHByZXNlbnRhdGlvbi5zY29yZSk7IGVsc2Ugc3RhdHVzVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXNjb3JlXCI+e3sgcHJlc2VudGF0aW9uLnNjb3JlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXNjb3JlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJlc2VudGF0aW9uLnNjb3JlRGV0YWlscyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmVzZW50YXRpb24uc2Vjb25kYXJ5ICE9PSB1bmRlZmluZWQ7IGVsc2Ugc2luZ2xlU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByZXN0LXN0YXR1cy1ibG9jay1wcmltYXJ5XCI+e3sgcHJlc2VudGF0aW9uLnByaW1hcnkgfHwgJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzdGF0dXNTZXBhcmF0b3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByZXN0LXN0YXR1cy1ibG9jay1zZWNvbmRhcnlcIj57eyBwcmVzZW50YXRpb24uc2Vjb25kYXJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVN0YXR1cz57eyBwcmVzZW50YXRpb24ucHJpbWFyeSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmYWlsZWRPckZyb3plblN0YXR1cz5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXMucmVzdWx0ID09PSAnPycgfHwgc3RhdHVzLnJlc3VsdCA9PT0gJ1JKJzsgZWxzZSBlbXB0eVN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic3RhdHVzQ2VsbENsYXNzKHN0YXR1cylcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwic3RhdHVzQ2VsbFJvbGUoc3RhdHVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwic3RhdHVzQ2VsbFRhYkluZGV4KHN0YXR1cylcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbWl0U29sdXRpb25DbGljaygkZXZlbnQsIHJvdywgcm93SW5kZXgsIHN0YXR1cywgcHJvYmxlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGVTdGF0dXNDZWxsRnJvbUtleWJvYXJkKCRldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZVN0YXR1c0NlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0YXR1c1ByZXNlbnRhdGlvbihzdGF0dXMpIGFzIHByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXNlbnRhdGlvbi5zZWNvbmRhcnkgIT09IHVuZGVmaW5lZDsgZWxzZSBzaW5nbGVTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXByaW1hcnlcIj57eyBwcmVzZW50YXRpb24ucHJpbWFyeSB8fCAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RleHRDb250ZW50XT1cInN0YXR1c1NlcGFyYXRvclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXNlY29uZGFyeVwiPnt7IHByZXNlbnRhdGlvbi5zZWNvbmRhcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlU3RhdHVzPnt7IHByZXNlbnRhdGlvbi5wcmltYXJ5IH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5U3RhdHVzPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzcmstc3RhdHVzLXBsYWNlaG9sZGVyLWNlbGwgc3JrLS10ZXh0LWNlbnRlciBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGVtcHR5U3RhdHVzUGxhY2Vob2xkZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd0RpcnRDb2x1bW5cIiBjbGFzcz1cInNyay1kaXJ0LWNlbGwgc3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCI+XG4gICAgICAgICAgICAgICAge3sgY2FsY3VsYXRlRGlydFBlcmNlbnRhZ2Uocm93KSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzaG93U0VDb2x1bW5cIiBjbGFzcz1cInNyay1zZS1jZWxsIHNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IGNhbGN1bGF0ZVNFVmFsdWUocm93LCBwcm9ibGVtU3RhdGlzdGljcykgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8dGZvb3QgKm5nSWY9XCJzaG93UHJvYmxlbVN0YXRpc3RpY3NGb290ZXJcIj5cbiAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZm9vdGVyUm93IG9mIHByb2JsZW1TdGF0aXN0aWNzRm9vdGVyUm93c1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItcm93XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1sYWJlbHMgc3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImxlZnRGb290ZXJDb2x1bW5Db3VudCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWxhYmVsIHNyay0tYy10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCJmb290ZXJSb3cudG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZm9vdGVyUm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RhdCBvZiBwcm9ibGVtU3RhdGlzdGljc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay0tdGV4dC1jZW50ZXIgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICB7eyBnZXRQcm9ibGVtU3RhdGlzdGljc0Zvb3RlckNlbGxQcmltYXJ5KGZvb3RlclJvdy5rZXksIHN0YXQpIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRQcm9ibGVtU3RhdGlzdGljc0Zvb3RlckNlbGxTZWNvbmRhcnkoZm9vdGVyUm93LmtleSwgc3RhdCkgIT09IHVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGdldFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyQ2VsbFNlY29uZGFyeShmb290ZXJSb3cua2V5LCBzdGF0KSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dEaXJ0Q29sdW1uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWV4dHJhLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWRpcnQtZm9vdGVyLWNlbGwgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1wcmltYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dTRUNvbHVtblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay1leHRyYS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay1zZS1mb290ZXItY2VsbCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByaW1hcnlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItcm93IHNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByb2JsZW0tbGFiZWwtcm93XCI+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItbGFiZWxzIHNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJsZWZ0Rm9vdGVyQ29sdW1uQ291bnQoKVwiXG4gICAgICAgICAgICAgID48L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvYmxlbSBvZiBkYXRhLnByb2JsZW1zOyBsZXQgcHJvYmxlbUluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItY2VsbCBzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1wcm9ibGVtLWhlYWRlciBzcmstcHJvYmxlbS1oZWFkZXIgc3JrLS10ZXh0LWNlbnRlciBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwicHJvYmxlbUhlYWRlckJhY2tncm91bmRJbWFnZShwcm9ibGVtLCAwKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay0tZGlzcGxheS1ibG9ja1wiPnt7IHByb2JsZW1BbGlhcyhwcm9ibGVtLCBwcm9ibGVtSW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dEaXJ0Q29sdW1uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWV4dHJhLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWRpcnQtZm9vdGVyLWNlbGwgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1wcmltYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dTRUNvbHVtblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay1leHRyYS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay1zZS1mb290ZXItY2VsbCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByaW1hcnlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGZvb3Q+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBSYW5rbGlzdENvbXBvbmVudCB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGRhdGEhOiBTdGF0aWNSYW5rbGlzdDtcbiAgQElucHV0KCkgdGhlbWU6IEVudW1UaGVtZSA9IEVudW1UaGVtZS5saWdodDtcbiAgQElucHV0KCkgcm93Qm9yZGVyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sdW1uQm9yZGVyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcm93U3RyaXBlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBmb3JtYXRTcmtBc3NldFVybD86ICh1cmw6IHN0cmluZywgZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBASW5wdXQoKSBzcGxpdE9yZ2FuaXphdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2x1bW5UaXRsZXM/OiBSYW5rbGlzdENvbHVtblRpdGxlcztcbiAgQElucHV0KCkgc3RhdHVzQ2VsbFByZXNldDogUmFua2xpc3RTdGF0dXNDZWxsUHJlc2V0ID0gJ2NsYXNzaWMnO1xuICBASW5wdXQoKSBzdGF0dXNDb2xvckFzVGV4dCA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93UHJvYmxlbVN0YXRpc3RpY3NGb290ZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0RpcnRDb2x1bW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd1NFQ29sdW1uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVtcHR5U3RhdHVzUGxhY2Vob2xkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB1c2VyQXZhdGFyUGxhY2VtZW50OiBSYW5rbGlzdFVzZXJBdmF0YXJQbGFjZW1lbnQgPSAndXNlcic7XG4gIEBJbnB1dCgpIGxhbmd1YWdlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIEBPdXRwdXQoKSB1c2VyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXJDbGlja1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBwcm9ibGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2JsZW1DbGlja1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBzb2x1dGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTb2x1dGlvbkNsaWNrUGF5bG9hZD4oKTtcblxuICBAQ29udGVudENoaWxkKFNya1Byb2JsZW1IZWFkZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb2JsZW1IZWFkZXJDZWxsVGVtcGxhdGU/OiBTcmtQcm9ibGVtSGVhZGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gIEBDb250ZW50Q2hpbGQoU3JrU3RhdHVzQ2VsbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBzdGF0dXNDZWxsVGVtcGxhdGU/OiBTcmtTdGF0dXNDZWxsVGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgQENvbnRlbnRDaGlsZChTcmtVc2VyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlKVxuICB1c2VyQ2VsbFRlbXBsYXRlPzogU3JrVXNlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICByZWFkb25seSBzdXBwb3J0ZWRWZXJzaW9ucyA9IHNya1N1cHBvcnRlZFZlcnNpb25zO1xuICByZWFkb25seSBmaXJzdEJsb29kU3RhciA9ICdcXHUyNjA1JztcbiAgcmVhZG9ubHkgc3RhdHVzU2VwYXJhdG9yID0gJyAnO1xuICByZWFkb25seSBwcm9ibGVtU3RhdGlzdGljc0Zvb3RlclJvd3MgPSBbXG4gICAge1xuICAgICAga2V5OiAnYWNjZXB0ZWQnLFxuICAgICAgbGFiZWw6ICdBY2NlcHRlZCcsXG4gICAgICB0b29sdGlwOiAnTnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aG8gc29sdmVkIHRoaXMgcHJvYmxlbScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdhdHRlbXB0ZWQnLFxuICAgICAgbGFiZWw6ICdBdHRlbXB0ZWQnLFxuICAgICAgdG9vbHRpcDogJ051bWJlciBvZiBwYXJ0aWNpcGFudHMgd2hvIGF0dGVtcHRlZCB0aGlzIHByb2JsZW0nLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnc3VibWl0dGVkJyxcbiAgICAgIGxhYmVsOiAnU3VibWl0dGVkJyxcbiAgICAgIHRvb2x0aXA6ICdUb3RhbCBudW1iZXIgb2YgdmFsaWQgc3VibWlzc2lvbnMgZm9yIHRoaXMgcHJvYmxlbScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdkaXJ0JyxcbiAgICAgIGxhYmVsOiAnRGlydCcsXG4gICAgICB0b29sdGlwOiAnV3Jvbmcgc3VibWlzc2lvbnMgYW1vbmcgcGFydGljaXBhbnRzIHdobyBzb2x2ZWQgdGhpcyBwcm9ibGVtJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3NlJyxcbiAgICAgIGxhYmVsOiAnU0UnLFxuICAgICAgdG9vbHRpcDogJ0F2ZXJhZ2UgaGFyZG5lc3MsIGNhbGN1bGF0ZWQgYXMgKHBhcnRpY2lwYW50cyAtIGFjY2VwdGVkKSAvIHBhcnRpY2lwYW50cycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdmaXJzdEFjY2VwdGVkJyxcbiAgICAgIGxhYmVsOiAnRkIgYXQnLFxuICAgICAgdG9vbHRpcDogJ0ZpcnN0IEJsb29kIGF0LCBhbHNvIGtub3duIGFzIGZpcnN0IHNvbHZlIHRpbWUsIGluIG1pbnV0ZXMnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnbGFzdEFjY2VwdGVkJyxcbiAgICAgIGxhYmVsOiAnTEIgYXQnLFxuICAgICAgdG9vbHRpcDogJ0xhc3QgQmxvb2QgYXQsIGFsc28ga25vd24gYXMgbGFzdCBzb2x2ZSB0aW1lLCBpbiBtaW51dGVzJyxcbiAgICB9LFxuICBdO1xuICBwcml2YXRlIHByb2JsZW1TdGF0aXN0aWNzU291cmNlPzogU3RhdGljUmFua2xpc3Q7XG4gIHByaXZhdGUgcHJvYmxlbVN0YXRpc3RpY3NDYWNoZT86IFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyW107XG5cbiAgZ2V0IHByb2JsZW1TdGF0aXN0aWNzKCkge1xuICAgIGlmICghdGhpcy5zaG93UHJvYmxlbVN0YXRpc3RpY3NGb290ZXIgJiYgIXRoaXMuc2hvd1NFQ29sdW1uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2JsZW1TdGF0aXN0aWNzU291cmNlICE9PSB0aGlzLmRhdGEgfHwgIXRoaXMucHJvYmxlbVN0YXRpc3RpY3NDYWNoZSkge1xuICAgICAgdGhpcy5wcm9ibGVtU3RhdGlzdGljc1NvdXJjZSA9IHRoaXMuZGF0YTtcbiAgICAgIHRoaXMucHJvYmxlbVN0YXRpc3RpY3NDYWNoZSA9IGNhbGN1bGF0ZVByb2JsZW1TdGF0aXN0aWNzRm9vdGVyKHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb2JsZW1TdGF0aXN0aWNzQ2FjaGU7XG4gIH1cblxuICBpc1N1cHBvcnRlZFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIGNhbml1c2UodGhpcy5kYXRhLnZlcnNpb24pO1xuICB9XG5cbiAgc2hvd1RpbWVDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHNob3VsZFNob3dUaW1lQ29sdW1uKHRoaXMuZGF0YS5yb3dzKTtcbiAgfVxuXG4gIHNob3dBdmF0YXJJbk9yZ2FuaXphdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdE9yZ2FuaXphdGlvbiAmJiB0aGlzLnVzZXJBdmF0YXJQbGFjZW1lbnQgPT09ICdvcmdhbml6YXRpb24nO1xuICB9XG5cbiAgbGVmdEZvb3RlckNvbHVtbkNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2VyaWVzLmxlbmd0aCArIDEgKyAxICsgKHRoaXMuc2hvd1RpbWVDb2x1bW4oKSA/IDEgOiAwKSArICh0aGlzLnNwbGl0T3JnYW5pemF0aW9uID8gMSA6IDApO1xuICB9XG5cbiAgZ2V0UmFua1ZhbHVlcyhyb3c6IFN0YXRpY1JhbmtsaXN0Um93KTogUmFua1ZhbHVlW10ge1xuICAgIHJldHVybiByb3cucmFua1ZhbHVlcyB8fCB0aGlzLmRhdGEuc2VyaWVzLm1hcCgoKSA9PiAoeyByYW5rOiBudWxsLCBzZWdtZW50SW5kZXg6IG51bGwgfSkpO1xuICB9XG5cbiAgZ2V0UmFua1RleHQocmFua1ZhbHVlOiBSYW5rVmFsdWUsIHJvdzogU3RhdGljUmFua2xpc3RSb3cpIHtcbiAgICByZXR1cm4gcmFua1ZhbHVlLnJhbmsgPyByYW5rVmFsdWUucmFuayA6IHJvdy51c2VyLm9mZmljaWFsID09PSBmYWxzZSA/ICfvvIonIDogJyc7XG4gIH1cblxuICByZXNvbHZlRGlzcGxheVRleHQodGV4dDogUGFyYW1ldGVyczx0eXBlb2YgcmVzb2x2ZVRleHQ+WzBdKSB7XG4gICAgcmV0dXJuIHJlc29sdmVUZXh0KHRleHQsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgfVxuXG4gIHJlc29sdmVTZXJpZXNDb2x1bW5UaXRsZShzZXJpZXM6IHNyay5SYW5rU2VyaWVzLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VyaWVzVGl0bGVzID0gdGhpcy5jb2x1bW5UaXRsZXM/LnNlcmllcztcbiAgICBpZiAodHlwZW9mIHNlcmllc1RpdGxlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNlcmllc1RpdGxlcyhzZXJpZXMsIGluZGV4KSA/PyBzZXJpZXMudGl0bGU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlcmllc1RpdGxlcykpIHtcbiAgICAgIHJldHVybiBzZXJpZXNUaXRsZXNbaW5kZXhdID8/IHNlcmllcy50aXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcmllcy50aXRsZTtcbiAgfVxuXG4gIHJlc29sdmVDb2x1bW5UaXRsZShrZXk6IEV4Y2x1ZGU8a2V5b2YgUmFua2xpc3RDb2x1bW5UaXRsZXMsICdzZXJpZXMnPiwgZmFsbGJhY2s6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblRpdGxlcz8uW2tleV0gPz8gZmFsbGJhY2s7XG4gIH1cblxuICBwcm9ibGVtQWxpYXMocHJvYmxlbTogc3JrLlByb2JsZW0sIHByb2JsZW1JbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHByb2JsZW0uYWxpYXMgfHwgbnVtYmVyVG9BbHBoYWJldChwcm9ibGVtSW5kZXgpO1xuICB9XG5cbiAgcHJvYmxlbVN0YXRzVGl0bGUoc3RhdGlzdGljczogc3JrLlByb2JsZW1TdGF0aXN0aWNzKSB7XG4gICAgY29uc3QgcmF0aW8gPSBzdGF0aXN0aWNzLnN1Ym1pdHRlZCA/ICgoc3RhdGlzdGljcy5hY2NlcHRlZCAvIHN0YXRpc3RpY3Muc3VibWl0dGVkKSAqIDEwMCkudG9GaXhlZCgxKSA6IDA7XG4gICAgcmV0dXJuIGAke3N0YXRpc3RpY3MuYWNjZXB0ZWR9IC8gJHtzdGF0aXN0aWNzLnN1Ym1pdHRlZH0gKCR7cmF0aW99JSlgO1xuICB9XG5cbiAgcHJvYmxlbUhlYWRlckJhY2tncm91bmRJbWFnZShwcm9ibGVtOiBzcmsuUHJvYmxlbSwgZ3JhZGllbnREaXJlY3Rpb24gPSAxODApIHtcbiAgICByZXR1cm4gZ2V0UHJvYmxlbUhlYWRlckJhY2tncm91bmRJbWFnZShwcm9ibGVtLnN0eWxlLCB0aGlzLnRoZW1lLCBncmFkaWVudERpcmVjdGlvbik7XG4gIH1cblxuICByZXNvbHZlZFVzZXJNYXJrZXJzKHVzZXI6IHNyay5Vc2VyKSB7XG4gICAgcmV0dXJuIHJlc29sdmVVc2VyTWFya2Vycyh1c2VyLCB0aGlzLmRhdGEubWFya2VycykubWFwKChtYXJrZXIpID0+ICh7XG4gICAgICBtYXJrZXIsXG4gICAgICBwcmVzZW50YXRpb246IGdldE1hcmtlclByZXNlbnRhdGlvbihtYXJrZXIsIHRoaXMudGhlbWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGZvcm1hdEFzc2V0VXJsKHVybDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlc29sdmVTcmtBc3NldFVybCh1cmwsIGZpZWxkLCB0aGlzLmZvcm1hdFNya0Fzc2V0VXJsKTtcbiAgfVxuXG4gIGZvcm1hdFRpbWUodGltZTogUGFyYW1ldGVyczx0eXBlb2YgZm9ybWF0VGltZUR1cmF0aW9uPlswXSkge1xuICAgIHJldHVybiBmb3JtYXRUaW1lRHVyYXRpb24odGltZSwgJ21pbicsIE1hdGguZmxvb3IpO1xuICB9XG5cbiAgY2FsY3VsYXRlRGlydFBlcmNlbnRhZ2Uocm93OiBTdGF0aWNSYW5rbGlzdFJvdykge1xuICAgIHJldHVybiBjYWxjdWxhdGVEaXJ0UGVyY2VudGFnZShyb3cpO1xuICB9XG5cbiAgY2FsY3VsYXRlU0VWYWx1ZShyb3c6IFN0YXRpY1JhbmtsaXN0Um93LCBwcm9ibGVtU3RhdGlzdGljczogUHJvYmxlbVN0YXRpc3RpY3NGb290ZXJbXSkge1xuICAgIHJldHVybiBjYWxjdWxhdGVTRVZhbHVlKHJvdywgcHJvYmxlbVN0YXRpc3RpY3MpO1xuICB9XG5cbiAgc3RhdHVzUHJlc2VudGF0aW9uKHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzKSB7XG4gICAgcmV0dXJuIGdldFJhbmtQcm9ibGVtU3RhdHVzQ2VsbFByZXNlbnRhdGlvbihzdGF0dXMsIHRoaXMuZGF0YSwgdGhpcy5zdGF0dXNDZWxsUHJlc2V0KTtcbiAgfVxuXG4gIGlzTnVtYmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgfVxuXG4gIGdldFN0YXR1c1NvbHV0aW9ucyhzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cykge1xuICAgIHJldHVybiBbLi4uKHN0YXR1cy5zb2x1dGlvbnMgfHwgW10pXS5yZXZlcnNlKCk7XG4gIH1cblxuICBzdGF0dXNDZWxsQ2xhc3Moc3RhdHVzOiBzcmsuUmFua1Byb2JsZW1TdGF0dXMpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gWydzcmstcHJlc3Qtc3RhdHVzLWJsb2NrJywgJ3Nyay0tdGV4dC1jZW50ZXInLCAnc3JrLS1ub3dyYXAnXTtcbiAgICBpZiAodGhpcy5pc1N0YXR1c0NsaWNrYWJsZShzdGF0dXMpKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3Nyay0tY3Vyc29yLXBvaW50ZXInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdHVzQ29sb3JBc1RleHQpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc3JrLXByZXN0LXN0YXR1cy1ibG9jay1jb2xvci10ZXh0Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMucmVzdWx0ID09PSAnRkInKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3Nyay1wcmVzdC1zdGF0dXMtYmxvY2stZmInKTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5yZXN1bHQgPT09ICdBQycpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc3JrLXByZXN0LXN0YXR1cy1ibG9jay1hY2NlcHRlZCcpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnJlc3VsdCA9PT0gJz8nKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3Nyay1wcmVzdC1zdGF0dXMtYmxvY2stZnJvemVuJyk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMucmVzdWx0ID09PSAnUkonKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3Nyay1wcmVzdC1zdGF0dXMtYmxvY2stZmFpbGVkJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGlzU3RhdHVzQ2xpY2thYmxlKHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhdHVzU29sdXRpb25zKHN0YXR1cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHN0YXR1c0NlbGxSb2xlKHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdGF0dXNDbGlja2FibGUoc3RhdHVzKSA/ICdidXR0b24nIDogbnVsbDtcbiAgfVxuXG4gIHN0YXR1c0NlbGxUYWJJbmRleChzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cykge1xuICAgIHJldHVybiB0aGlzLmlzU3RhdHVzQ2xpY2thYmxlKHN0YXR1cykgPyAwIDogbnVsbDtcbiAgfVxuXG4gIGhhc1Byb2JsZW1DbGlja0xpc3RlbmVyKCkge1xuICAgIGNvbnN0IGVtaXR0ZXIgPSB0aGlzLnByb2JsZW1DbGljayBhcyBFdmVudEVtaXR0ZXI8UHJvYmxlbUNsaWNrUGF5bG9hZD4gJiB7XG4gICAgICBvYnNlcnZlZD86IGJvb2xlYW47XG4gICAgICBvYnNlcnZlcnM/OiB1bmtub3duW107XG4gICAgfTtcbiAgICByZXR1cm4gZW1pdHRlci5vYnNlcnZlZCA9PT0gdHJ1ZSB8fCBCb29sZWFuKGVtaXR0ZXIub2JzZXJ2ZXJzPy5sZW5ndGgpO1xuICB9XG5cbiAgcHJvYmxlbUhlYWRlclJvbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvYmxlbUNsaWNrTGlzdGVuZXIoKSA/ICdidXR0b24nIDogbnVsbDtcbiAgfVxuXG4gIHByb2JsZW1IZWFkZXJUYWJJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9ibGVtQ2xpY2tMaXN0ZW5lcigpID8gMCA6IG51bGw7XG4gIH1cblxuICBidWlsZFByb2JsZW1IZWFkZXJDZWxsQ29udGV4dChwcm9ibGVtOiBzcmsuUHJvYmxlbSwgcHJvYmxlbUluZGV4OiBudW1iZXIpOiBQcm9ibGVtSGVhZGVyQ2VsbFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogcHJvYmxlbSxcbiAgICAgIHByb2JsZW0sXG4gICAgICBwcm9ibGVtSW5kZXgsXG4gICAgICBpbmRleDogcHJvYmxlbUluZGV4LFxuICAgICAgcmFua2xpc3Q6IHRoaXMuZGF0YSxcbiAgICAgIGxhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMsXG4gICAgICBvbkNsaWNrOiAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB0aGlzLmVtaXRQcm9ibGVtQ2xpY2soZXZlbnQsIHByb2JsZW0sIHByb2JsZW1JbmRleCksXG4gICAgfTtcbiAgfVxuXG4gIGJ1aWxkVXNlckNlbGxDb250ZXh0KHJvdzogU3RhdGljUmFua2xpc3RSb3csIHJvd0luZGV4OiBudW1iZXIpOiBVc2VyQ2VsbFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogcm93LnVzZXIsXG4gICAgICB1c2VyOiByb3cudXNlcixcbiAgICAgIHJvdyxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgcmFua2xpc3Q6IHRoaXMuZGF0YSxcbiAgICAgIG1hcmtlcnM6IHRoaXMuZGF0YS5tYXJrZXJzLFxuICAgICAgaGlkZU9yZ2FuaXphdGlvbjogdGhpcy5zcGxpdE9yZ2FuaXphdGlvbixcbiAgICAgIGhpZGVBdmF0YXI6IHRoaXMuc2hvd0F2YXRhckluT3JnYW5pemF0aW9uKCksXG4gICAgICBsYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLFxuICAgICAgb25DbGljazogKGV2ZW50PzogTW91c2VFdmVudCkgPT4gdGhpcy5lbWl0VXNlckNsaWNrKGV2ZW50LCByb3csIHJvd0luZGV4KSxcbiAgICB9O1xuICB9XG5cbiAgYnVpbGRTdGF0dXNDZWxsQ29udGV4dChcbiAgICByb3c6IFN0YXRpY1JhbmtsaXN0Um93LFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgc3RhdHVzOiBzcmsuUmFua1Byb2JsZW1TdGF0dXMsXG4gICAgcHJvYmxlbUluZGV4OiBudW1iZXIsXG4gICk6IFN0YXR1c0NlbGxUZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHN0YXR1cyxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHByb2JsZW06IHRoaXMuZGF0YS5wcm9ibGVtc1twcm9ibGVtSW5kZXhdLFxuICAgICAgcHJvYmxlbUluZGV4LFxuICAgICAgdXNlcjogcm93LnVzZXIsXG4gICAgICByb3csXG4gICAgICByb3dJbmRleCxcbiAgICAgIHJhbmtsaXN0OiB0aGlzLmRhdGEsXG4gICAgICBzb2x1dGlvbnM6IHRoaXMuZ2V0U3RhdHVzU29sdXRpb25zKHN0YXR1cyksXG4gICAgICBzdGF0dXNDZWxsUHJlc2V0OiB0aGlzLnN0YXR1c0NlbGxQcmVzZXQsXG4gICAgICBzdGF0dXNDb2xvckFzVGV4dDogdGhpcy5zdGF0dXNDb2xvckFzVGV4dCxcbiAgICAgIGVtcHR5U3RhdHVzUGxhY2Vob2xkZXI6IHRoaXMuZW1wdHlTdGF0dXNQbGFjZWhvbGRlcixcbiAgICAgIGxhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMsXG4gICAgICBvbkNsaWNrOiAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB0aGlzLmVtaXRTb2x1dGlvbkNsaWNrKGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleCksXG4gICAgfTtcbiAgfVxuXG4gIGFjdGl2YXRlVXNlckNlbGxGcm9tS2V5Ym9hcmQoZXZlbnQ6IEV2ZW50LCByb3c6IFN0YXRpY1JhbmtsaXN0Um93LCByb3dJbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmVtaXRVc2VyQ2xpY2sodW5kZWZpbmVkLCByb3csIHJvd0luZGV4KTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJvYmxlbUhlYWRlckZyb21LZXlib2FyZChldmVudDogRXZlbnQsIHByb2JsZW06IHNyay5Qcm9ibGVtLCBwcm9ibGVtSW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5oYXNQcm9ibGVtQ2xpY2tMaXN0ZW5lcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbWl0UHJvYmxlbUNsaWNrKHVuZGVmaW5lZCwgcHJvYmxlbSwgcHJvYmxlbUluZGV4KTtcbiAgfVxuXG4gIGFjdGl2YXRlU3RhdHVzQ2VsbEZyb21LZXlib2FyZChcbiAgICBldmVudDogRXZlbnQsXG4gICAgcm93OiBTdGF0aWNSYW5rbGlzdFJvdyxcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzLFxuICAgIHByb2JsZW1JbmRleDogbnVtYmVyLFxuICApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZW1pdFNvbHV0aW9uQ2xpY2sodW5kZWZpbmVkLCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleCk7XG4gIH1cblxuICBlbWl0VXNlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkLCByb3c6IFN0YXRpY1JhbmtsaXN0Um93LCByb3dJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjYXB0dXJlTW9kYWxUcmlnZ2VyUG9pbnRGcm9tTW91c2VFdmVudChldmVudCwge1xuICAgICAgICBzb3VyY2U6ICd1c2VyLWNlbGwnLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgdXNlcklkOiByb3cudXNlci5pZCB8fCBudWxsLFxuICAgICAgICAgIHVzZXJOYW1lOiB0aGlzLnJlc29sdmVEaXNwbGF5VGV4dChyb3cudXNlci5uYW1lKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVzZXJDbGljay5lbWl0KHtcbiAgICAgIHVzZXI6IHJvdy51c2VyLFxuICAgICAgcm93LFxuICAgICAgcm93SW5kZXgsXG4gICAgICByYW5rbGlzdDogdGhpcy5kYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgZW1pdFByb2JsZW1DbGljayhldmVudDogTW91c2VFdmVudCB8IHVuZGVmaW5lZCwgcHJvYmxlbTogc3JrLlByb2JsZW0sIHByb2JsZW1JbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmhhc1Byb2JsZW1DbGlja0xpc3RlbmVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY2FwdHVyZU1vZGFsVHJpZ2dlclBvaW50RnJvbU1vdXNlRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgc291cmNlOiAncHJvYmxlbS1oZWFkZXInLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgcHJvYmxlbUluZGV4LFxuICAgICAgICAgIHByb2JsZW1BbGlhczogcHJvYmxlbS5hbGlhcyB8fCBudWxsLFxuICAgICAgICAgIHByb2JsZW1UaXRsZTogdGhpcy5yZXNvbHZlRGlzcGxheVRleHQocHJvYmxlbS50aXRsZSkgfHwgbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByb2JsZW1DbGljay5lbWl0KHtcbiAgICAgIHByb2JsZW0sXG4gICAgICBwcm9ibGVtSW5kZXgsXG4gICAgICByYW5rbGlzdDogdGhpcy5kYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgZW1pdFNvbHV0aW9uQ2xpY2soXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCB1bmRlZmluZWQsXG4gICAgcm93OiBTdGF0aWNSYW5rbGlzdFJvdyxcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzLFxuICAgIHByb2JsZW1JbmRleDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBzb2x1dGlvbnMgPSB0aGlzLmdldFN0YXR1c1NvbHV0aW9ucyhzdGF0dXMpO1xuICAgIGlmICghc29sdXRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGNhcHR1cmVNb2RhbFRyaWdnZXJQb2ludEZyb21Nb3VzZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgIHNvdXJjZTogJ3N0YXR1cy1jZWxsJyxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgIHByb2JsZW1JbmRleCxcbiAgICAgICAgICBwcm9ibGVtQWxpYXM6IHRoaXMuZGF0YS5wcm9ibGVtc1twcm9ibGVtSW5kZXhdPy5hbGlhcyB8fCBudWxsLFxuICAgICAgICAgIHByb2JsZW1UaXRsZTogdGhpcy5kYXRhLnByb2JsZW1zW3Byb2JsZW1JbmRleF0gPyB0aGlzLnJlc29sdmVEaXNwbGF5VGV4dCh0aGlzLmRhdGEucHJvYmxlbXNbcHJvYmxlbUluZGV4XS50aXRsZSkgOiBudWxsLFxuICAgICAgICAgIHVzZXJJZDogcm93LnVzZXIuaWQgfHwgbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNvbHV0aW9uQ2xpY2suZW1pdCh7XG4gICAgICB1c2VyOiByb3cudXNlcixcbiAgICAgIHJvdyxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgcHJvYmxlbUluZGV4LFxuICAgICAgcHJvYmxlbTogdGhpcy5kYXRhLnByb2JsZW1zW3Byb2JsZW1JbmRleF0sXG4gICAgICBzdGF0dXMsXG4gICAgICBzb2x1dGlvbnMsXG4gICAgICByYW5rbGlzdDogdGhpcy5kYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU2VyaWVzU2VnbWVudChyYW5rVmFsdWU6IFJhbmtWYWx1ZSwgc2VyaWVzOiBzcmsuUmFua1NlcmllcyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluZGV4ID0gcmFua1ZhbHVlLnNlZ21lbnRJbmRleCB8fCByYW5rVmFsdWUuc2VnbWVudEluZGV4ID09PSAwID8gcmFua1ZhbHVlLnNlZ21lbnRJbmRleCA6IC0xO1xuICAgIHJldHVybiAoc2VyaWVzPy5zZWdtZW50cyB8fCBbXSlbaW5kZXhdIHx8IHt9O1xuICB9XG5cbiAgaXNTZXJpZXNTZWdtZW50ZWRDb2x1bW4oc2VyaWVzOiBzcmsuUmFua1NlcmllcyB8IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoc2VyaWVzPy5zZWdtZW50cyB8fCBbXSkuc29tZSgoc2VnbWVudCkgPT4gdHlwZW9mIHNlZ21lbnQuc3R5bGUgPT09ICdzdHJpbmcnKTtcbiAgfVxuXG4gIGdldFNlcmllc1NlZ21lbnRDbGFzcyhyYW5rVmFsdWU6IFJhbmtWYWx1ZSwgc2VyaWVzOiBzcmsuUmFua1NlcmllcyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHNlZ21lbnRTdHlsZSA9IHRoaXMucmVzb2x2ZVNlcmllc1NlZ21lbnQocmFua1ZhbHVlLCBzZXJpZXMpLnN0eWxlO1xuICAgIHJldHVybiB0eXBlb2Ygc2VnbWVudFN0eWxlID09PSAnc3RyaW5nJyA/IGBzcmstcHJlc2V0LXNlcmllcy1zZWdtZW50LSR7c2VnbWVudFN0eWxlfWAgOiAnJztcbiAgfVxuXG4gIGdldFNlcmllc1NlZ21lbnRTdHlsZShyYW5rVmFsdWU6IFJhbmtWYWx1ZSwgc2VyaWVzOiBzcmsuUmFua1NlcmllcyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGVtcHR5Q29sb3I6IFRoZW1lQ29sb3IgPSB7XG4gICAgICBbRW51bVRoZW1lLmxpZ2h0XTogdW5kZWZpbmVkLFxuICAgICAgW0VudW1UaGVtZS5kYXJrXTogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgY29uc3Qgc2VnbWVudFN0eWxlID0gdGhpcy5yZXNvbHZlU2VyaWVzU2VnbWVudChyYW5rVmFsdWUsIHNlcmllcykuc3R5bGU7XG4gICAgaWYgKCFzZWdtZW50U3R5bGUgfHwgdHlwZW9mIHNlZ21lbnRTdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGUoc2VnbWVudFN0eWxlKTtcbiAgICBjb25zdCB0ZXh0Q29sb3IgPSBzdHlsZS50ZXh0Q29sb3IgfHwgZW1wdHlDb2xvcjtcbiAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IgfHwgZW1wdHlDb2xvcjtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHRleHRDb2xvclt0aGlzLnRoZW1lXSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yW3RoaXMudGhlbWVdLFxuICAgIH07XG4gIH1cblxuICBnZXRQcm9ibGVtU3RhdGlzdGljc0Zvb3RlckNlbGxQcmltYXJ5KGtleTogc3RyaW5nLCBzdGF0OiBQcm9ibGVtU3RhdGlzdGljc0Zvb3Rlcikge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdhY2NlcHRlZCc6XG4gICAgICAgIHJldHVybiBzdGF0LmFjY2VwdGVkO1xuICAgICAgY2FzZSAnYXR0ZW1wdGVkJzpcbiAgICAgICAgcmV0dXJuIHN0YXQuYXR0ZW1wdGVkO1xuICAgICAgY2FzZSAnc3VibWl0dGVkJzpcbiAgICAgICAgcmV0dXJuIHN0YXQuc3VibWl0dGVkO1xuICAgICAgY2FzZSAnZGlydCc6XG4gICAgICAgIHJldHVybiBzdGF0LmRpcnQ7XG4gICAgICBjYXNlICdzZSc6XG4gICAgICAgIHJldHVybiBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc0F2ZXJhZ2VIYXJkbmVzcyhzdGF0KTtcbiAgICAgIGNhc2UgJ2ZpcnN0QWNjZXB0ZWQnOlxuICAgICAgICByZXR1cm4gZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NBY2NlcHRlZE1pbnV0ZShzdGF0LmZpcnN0QWNjZXB0ZWRUaW1lKTtcbiAgICAgIGNhc2UgJ2xhc3RBY2NlcHRlZCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc0FjY2VwdGVkTWludXRlKHN0YXQubGFzdEFjY2VwdGVkVGltZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvYmxlbVN0YXRpc3RpY3NGb290ZXJDZWxsU2Vjb25kYXJ5KGtleTogc3RyaW5nLCBzdGF0OiBQcm9ibGVtU3RhdGlzdGljc0Zvb3Rlcikge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdhY2NlcHRlZCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc1BlcmNlbnQoc3RhdC5hY2NlcHRlZCwgc3RhdC5wYXJ0aWNpcGFudENvdW50KTtcbiAgICAgIGNhc2UgJ2F0dGVtcHRlZCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc1BlcmNlbnQoc3RhdC5hdHRlbXB0ZWQsIHN0YXQucGFydGljaXBhbnRDb3VudCk7XG4gICAgICBjYXNlICdkaXJ0JzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFByb2JsZW1TdGF0aXN0aWNzUGVyY2VudChzdGF0LmRpcnQsIHN0YXQuZGlydFN1Ym1pdHRlZCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFua2xpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yYW5rbGlzdC9yYW5rbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFdBQVcsRUFDWCxrQkFBa0IsR0FDbkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdDQUFnQyxFQUNoQyxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHFDQUFxQyxFQUNyQyxzQ0FBc0MsRUFDdEMsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQix1Q0FBdUMsRUFDdkMsaUNBQWlDLEVBQ2pDLG9DQUFvQyxFQUNwQyxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixHQUNyQixNQUFNLG1EQUFtRCxDQUFDO0FBTzNELE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBU3JGLE9BQU8sRUFDTCxxQ0FBcUMsR0FFdEMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsOEJBQThCLEdBRS9CLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLDRCQUE0QixHQUU3QixNQUFNLGdDQUFnQyxDQUFDOzs7QUFvV3hDLE1BQU0sT0FBTyxpQkFBaUI7SUFDRCxJQUFJLENBQWtCO0lBQ3hDLEtBQUssR0FBYyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ25DLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsY0FBYyxHQUFH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WUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUdQLHlCQUF5QjtzQkFEeEIsWUFBWTt1QkFBQyxxQ0FBcUM7Z0JBSW5ELGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyw4QkFBOEI7Z0JBSTVDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgc3JrIGZyb20gJ0BhbGdvdXgvc3RhbmRhcmQtcmFua2xpc3QnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVudW1UaGVtZSxcbiAgZm9ybWF0VGltZUR1cmF0aW9uLFxuICBudW1iZXJUb0FscGhhYmV0LFxuICByZXNvbHZlU3R5bGUsXG4gIHJlc29sdmVUZXh0LFxuICByZXNvbHZlVXNlck1hcmtlcnMsXG59IGZyb20gJ0BhbGdvdXgvc3RhbmRhcmQtcmFua2xpc3QtdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaGVtZUNvbG9yIH0gZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdC11dGlscyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVEaXJ0UGVyY2VudGFnZSxcbiAgY2FsY3VsYXRlUHJvYmxlbVN0YXRpc3RpY3NGb290ZXIsXG4gIGNhbGN1bGF0ZVNFVmFsdWUsXG4gIGNhbml1c2UsXG4gIGZvcm1hdFByb2JsZW1TdGF0aXN0aWNzQWNjZXB0ZWRNaW51dGUsXG4gIGZvcm1hdFByb2JsZW1TdGF0aXN0aWNzQXZlcmFnZUhhcmRuZXNzLFxuICBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc1BlcmNlbnQsXG4gIGdldE1hcmtlclByZXNlbnRhdGlvbixcbiAgZ2V0UHJvYmxlbUhlYWRlckJhY2tncm91bmRJbWFnZUlmU3R5bGVkLFxuICBnZXRSYW5rUHJvYmxlbVN0YXR1c0NlbGxDbGFzc05hbWUsXG4gIGdldFJhbmtQcm9ibGVtU3RhdHVzQ2VsbFByZXNlbnRhdGlvbixcbiAgcmVzb2x2ZVNya0Fzc2V0VXJsLFxuICBzaG91bGRTaG93VGltZUNvbHVtbixcbiAgc3JrU3VwcG9ydGVkVmVyc2lvbnMsXG59IGZyb20gJ0BhbGdvdXgvc3RhbmRhcmQtcmFua2xpc3QtcmVuZGVyZXItY29tcG9uZW50LWNvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBQcm9ibGVtU3RhdGlzdGljc0Zvb3RlcixcbiAgUmFua2xpc3RDb2x1bW5UaXRsZXMsXG4gIFJhbmtsaXN0U3RhdHVzQ2VsbFByZXNldCxcbiAgUmFua2xpc3RVc2VyQXZhdGFyUGxhY2VtZW50LFxufSBmcm9tICdAYWxnb3V4L3N0YW5kYXJkLXJhbmtsaXN0LXJlbmRlcmVyLWNvbXBvbmVudC1jb3JlJztcbmltcG9ydCB7IGNhcHR1cmVNb2RhbFRyaWdnZXJQb2ludEZyb21Nb3VzZUV2ZW50IH0gZnJvbSAnLi4vbW9kYWwvbW9kYWwtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvYmxlbUNsaWNrUGF5bG9hZCxcbiAgUmFua1ZhbHVlLFxuICBTb2x1dGlvbkNsaWNrUGF5bG9hZCxcbiAgU3RhdGljUmFua2xpc3QsXG4gIFN0YXRpY1JhbmtsaXN0Um93LFxuICBVc2VyQ2xpY2tQYXlsb2FkLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICBTcmtQcm9ibGVtSGVhZGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICB0eXBlIFByb2JsZW1IZWFkZXJDZWxsVGVtcGxhdGVDb250ZXh0LFxufSBmcm9tICcuL3Byb2JsZW0taGVhZGVyLWNlbGwtdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIFNya1N0YXR1c0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgdHlwZSBTdGF0dXNDZWxsVGVtcGxhdGVDb250ZXh0LFxufSBmcm9tICcuL3N0YXR1cy1jZWxsLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBTcmtVc2VyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLFxuICB0eXBlIFVzZXJDZWxsVGVtcGxhdGVDb250ZXh0LFxufSBmcm9tICcuL3VzZXItY2VsbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcmstcmFua2xpc3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cImRhdGEudHlwZSAhPT0gJ2dlbmVyYWwnOyBlbHNlIHZlcnNpb25TdGF0ZVwiPlxuICAgICAgc3JrIHR5cGUgXCJ7eyBkYXRhLnR5cGUgfX1cIiBpcyBub3Qgc3VwcG9ydGVkXG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI3ZlcnNpb25TdGF0ZT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNTdXBwb3J0ZWRWZXJzaW9uKCk7IGVsc2UgcmFua2xpc3RUYWJsZVwiPlxuICAgICAgICBzcmsgdmVyc2lvbiBcInt7IGRhdGEudmVyc2lvbiB9fVwiIGlzIG5vdCBzdXBwb3J0ZWQgKGN1cnJlbnQgc3VwcG9ydGVkOiB7eyBzdXBwb3J0ZWRWZXJzaW9ucyB9fSlcbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3JhbmtsaXN0VGFibGU+XG4gICAgICA8ZGl2IGNsYXNzPVwic3JrLWNvbW1vbi10YWJsZSBzcmstbWFpblwiPlxuICAgICAgICA8dGFibGVcbiAgICAgICAgICBbY2xhc3Muc3JrLXRhYmxlLXJvdy1ib3JkZXJlZF09XCJyb3dCb3JkZXJlZFwiXG4gICAgICAgICAgW2NsYXNzLnNyay10YWJsZS1jb2x1bW4tYm9yZGVyZWRdPVwiY29sdW1uQm9yZGVyZWRcIlxuICAgICAgICAgIFtjbGFzcy5zcmstdGFibGUtcm93LXN0cmlwZWRdPVwicm93U3RyaXBlZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzZXJpZXNJdGVtIG9mIGRhdGEuc2VyaWVzOyBsZXQgc2VyaWVzSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstc2VyaWVzLWhlYWRlciBzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zcmstc2VyaWVzLXNlZ21lbnRlZC1jb2x1bW5dPVwiaXNTZXJpZXNTZWdtZW50ZWRDb2x1bW4oc2VyaWVzSXRlbSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgcmVzb2x2ZVNlcmllc0NvbHVtblRpdGxlKHNlcmllc0l0ZW0sIHNlcmllc0luZGV4KSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNwbGl0T3JnYW5pemF0aW9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1vcmdhbml6YXRpb24taGVhZGVyIHNyay0tdGV4dC1sZWZ0IHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHJlc29sdmVDb2x1bW5UaXRsZSgnb3JnYW5pemF0aW9uJywgJ09yZ2FuaXphdGlvbicpIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNyay0tdGV4dC1sZWZ0IHNyay0tbm93cmFwXCI+e3sgcmVzb2x2ZUNvbHVtblRpdGxlKCd1c2VyJywgJ05hbWUnKSB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPnt7IHJlc29sdmVDb2x1bW5UaXRsZSgnc2NvcmUnLCAnU2NvcmUnKSB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNob3dUaW1lQ29sdW1uKClcIiBjbGFzcz1cInNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IHJlc29sdmVDb2x1bW5UaXRsZSgndGltZScsICdUaW1lJykgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9ibGVtIG9mIGRhdGEucHJvYmxlbXM7IGxldCBwcm9ibGVtSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0UHJvYmxlbUhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ibGVtSGVhZGVyQ2VsbFRlbXBsYXRlLnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImJ1aWxkUHJvYmxlbUhlYWRlckNlbGxDb250ZXh0KHByb2JsZW0sIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRQcm9ibGVtSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLS1ub3dyYXAgc3JrLXByb2JsZW0taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNyay0tY3Vyc29yLXBvaW50ZXJdPVwiaGFzUHJvYmxlbUNsaWNrTGlzdGVuZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwicHJvYmxlbUhlYWRlclJvbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInByb2JsZW1IZWFkZXJUYWJJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwicHJvYmxlbUhlYWRlckJhY2tncm91bmRJbWFnZShwcm9ibGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbWl0UHJvYmxlbUNsaWNrKCRldmVudCwgcHJvYmxlbSwgcHJvYmxlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFjdGl2YXRlUHJvYmxlbUhlYWRlckZyb21LZXlib2FyZCgkZXZlbnQsIHByb2JsZW0sIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZVByb2JsZW1IZWFkZXJGcm9tS2V5Ym9hcmQoJGV2ZW50LCBwcm9ibGVtLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2JsZW0ubGluayAmJiAhaGFzUHJvYmxlbUNsaWNrTGlzdGVuZXIoKTsgZWxzZSB1bmxpbmtlZFByb2JsZW1IZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInByb2JsZW0ubGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB1bnNldFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay0tZGlzcGxheS1ibG9ja1wiPnt7IHByb2JsZW1BbGlhcyhwcm9ibGVtLCBwcm9ibGVtSW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2JsZW0uc3RhdGlzdGljc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay0tZGlzcGxheS1ibG9jayBzcmstcHJvYmxlbS1zdGF0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicHJvYmxlbVN0YXRzVGl0bGUocHJvYmxlbS5zdGF0aXN0aWNzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJvYmxlbS5zdGF0aXN0aWNzLmFjY2VwdGVkIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdW5saW5rZWRQcm9ibGVtSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLS1kaXNwbGF5LWJsb2NrXCI+e3sgcHJvYmxlbUFsaWFzKHByb2JsZW0sIHByb2JsZW1JbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvYmxlbS5zdGF0aXN0aWNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLS1kaXNwbGF5LWJsb2NrIHNyay1wcm9ibGVtLXN0YXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJwcm9ibGVtU3RhdHNUaXRsZShwcm9ibGVtLnN0YXRpc3RpY3MpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwcm9ibGVtLnN0YXRpc3RpY3MuYWNjZXB0ZWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzaG93RGlydENvbHVtblwiIGNsYXNzPVwic3JrLWRpcnQtaGVhZGVyIHNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IHJlc29sdmVDb2x1bW5UaXRsZSgnZGlydCcsICdEaXJ0JykgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2hvd1NFQ29sdW1uXCIgY2xhc3M9XCJzcmstc2UtaGVhZGVyIHNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IHJlc29sdmVDb2x1bW5UaXRsZSgnc2UnLCAnU0UnKSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIGRhdGEucm93czsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJhbmtWYWx1ZSBvZiBnZXRSYW5rVmFsdWVzKHJvdyk7IGxldCBzZXJpZXNJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay0tdGV4dC1yaWdodCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U2VyaWVzU2VnbWVudENsYXNzKHJhbmtWYWx1ZSwgZGF0YS5zZXJpZXNbc2VyaWVzSW5kZXhdKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNyay1zZXJpZXMtc2VnbWVudGVkLWNvbHVtbl09XCJpc1Nlcmllc1NlZ21lbnRlZENvbHVtbihkYXRhLnNlcmllc1tzZXJpZXNJbmRleF0pXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTZXJpZXNTZWdtZW50U3R5bGUocmFua1ZhbHVlLCBkYXRhLnNlcmllc1tzZXJpZXNJbmRleF0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGdldFJhbmtUZXh0KHJhbmtWYWx1ZSwgcm93KSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic3BsaXRPcmdhbml6YXRpb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLW9yZ2FuaXphdGlvbi1jZWxsIHNyay0tdGV4dC1sZWZ0IHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3JrLW9yZ2FuaXphdGlvbi1jZWxsLWF2YXRhcl09XCJzaG93QXZhdGFySW5Pcmdhbml6YXRpb24oKSAmJiAhIXJvdy51c2VyLmF2YXRhclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3JrLW9yZ2FuaXphdGlvbi1jZWxsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QXZhdGFySW5Pcmdhbml6YXRpb24oKSAmJiByb3cudXNlci5hdmF0YXJcIiBjbGFzcz1cInNyay11c2VyLWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJmb3JtYXRBc3NldFVybChyb3cudXNlci5hdmF0YXIsICd1c2VyLmF2YXRhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJVc2VyIEF2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLW9yZ2FuaXphdGlvbi1uYW1lLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnVzZXIub3JnYW5pemF0aW9uID8gcmVzb2x2ZURpc3BsYXlUZXh0KHJvdy51c2VyLm9yZ2FuaXphdGlvbikgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0Q29udGVudF09XCJyb3cudXNlci5vcmdhbml6YXRpb24gPyByZXNvbHZlRGlzcGxheVRleHQocm93LnVzZXIub3JnYW5pemF0aW9uKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJDZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdFVzZXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidXNlckNlbGxUZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiYnVpbGRVc2VyQ2VsbENvbnRleHQocm93LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRVc2VyQ2VsbD5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLS10ZXh0LWxlZnQgc3JrLS1ub3dyYXAgc3JrLXVzZXItY2VsbCBzcmstLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbWl0VXNlckNsaWNrKCRldmVudCwgcm93LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGVVc2VyQ2VsbEZyb21LZXlib2FyZCgkZXZlbnQsIHJvdywgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImFjdGl2YXRlVXNlckNlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNyay11c2VyLWNlbGwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93LnVzZXIuYXZhdGFyICYmICFzaG93QXZhdGFySW5Pcmdhbml6YXRpb24oKVwiIGNsYXNzPVwic3JrLXVzZXItYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJmb3JtYXRBc3NldFVybChyb3cudXNlci5hdmF0YXIsICd1c2VyLmF2YXRhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlVzZXIgQXZhdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNyay11c2VyLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3JrLXVzZXItbmFtZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXVzZXItbmFtZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInJlc29sdmVEaXNwbGF5VGV4dChyb3cudXNlci5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlc29sdmVEaXNwbGF5VGV4dChyb3cudXNlci5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstbWFya2VyLWRvdC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgcmVzb2x2ZWRVc2VyTWFya2Vycyhyb3cudXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLW1hcmtlciBzcmstbWFya2VyLWRvdCBzcmstLWMtdG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWFya2VyLnByZXNlbnRhdGlvbi5jbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIm1hcmtlci5wcmVzZW50YXRpb24uc3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCJyZXNvbHZlRGlzcGxheVRleHQobWFya2VyLm1hcmtlci5sYWJlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy51c2VyLm9yZ2FuaXphdGlvbiAmJiAhc3BsaXRPcmdhbml6YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstdXNlci1zZWNvbmRhcnktdGV4dCBzcmstLXRleHQtZWxsaXBzaXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlc29sdmVEaXNwbGF5VGV4dChyb3cudXNlci5vcmdhbml6YXRpb24pIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCI+e3sgcm93LnNjb3JlLnZhbHVlIH19PC90ZD5cbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd1RpbWVDb2x1bW4oKVwiIGNsYXNzPVwic3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCI+XG4gICAgICAgICAgICAgICAge3sgcm93LnNjb3JlLnRpbWUgPyBmb3JtYXRUaW1lKHJvdy5zY29yZS50aW1lKSA6ICctJyB9fVxuICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXR1cyBvZiByb3cuc3RhdHVzZXM7IGxldCBwcm9ibGVtSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0dXNDZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdFN0YXR1c0NlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhdHVzQ2VsbFRlbXBsYXRlLnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImJ1aWxkU3RhdHVzQ2VsbENvbnRleHQocm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3RhdHVzQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1cy5yZXN1bHQgPT09ICdGQicgfHwgc3RhdHVzLnJlc3VsdCA9PT0gJ0FDJzsgZWxzZSBmYWlsZWRPckZyb3plblN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInN0YXR1c0NlbGxDbGFzcyhzdGF0dXMpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJzdGF0dXNDZWxsUm9sZShzdGF0dXMpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwic3RhdHVzQ2VsbFRhYkluZGV4KHN0YXR1cylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW1pdFNvbHV0aW9uQ2xpY2soJGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhY3RpdmF0ZVN0YXR1c0NlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZVN0YXR1c0NlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzQ29sb3JBc1RleHQgJiYgc3RhdHVzLnJlc3VsdCA9PT0gJ0ZCJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLWZiLXN0YXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Q29udGVudF09XCJmaXJzdEJsb29kU3RhclwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0dXNQcmVzZW50YXRpb24oc3RhdHVzKSBhcyBwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOdW1iZXIocHJlc2VudGF0aW9uLnNjb3JlKTsgZWxzZSBzdGF0dXNUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcmVzdC1zdGF0dXMtYmxvY2stc2NvcmVcIj57eyBwcmVzZW50YXRpb24uc2NvcmUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlc2VudGF0aW9uLnNjb3JlRGV0YWlscyAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzdGF0dXNTZXBhcmF0b3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXNjb3JlLWRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Q29udGVudF09XCJwcmVzZW50YXRpb24uc2NvcmVEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmVzZW50YXRpb24uc2Vjb25kYXJ5ICE9PSB1bmRlZmluZWQ7IGVsc2Ugc2luZ2xlU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByZXN0LXN0YXR1cy1ibG9jay1wcmltYXJ5XCI+e3sgcHJlc2VudGF0aW9uLnByaW1hcnkgfHwgJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzdGF0dXNTZXBhcmF0b3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByZXN0LXN0YXR1cy1ibG9jay1zZWNvbmRhcnlcIj57eyBwcmVzZW50YXRpb24uc2Vjb25kYXJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVN0YXR1cz57eyBwcmVzZW50YXRpb24ucHJpbWFyeSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmYWlsZWRPckZyb3plblN0YXR1cz5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXMucmVzdWx0ID09PSAnPycgfHwgc3RhdHVzLnJlc3VsdCA9PT0gJ1JKJzsgZWxzZSBlbXB0eVN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic3RhdHVzQ2VsbENsYXNzKHN0YXR1cylcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwic3RhdHVzQ2VsbFJvbGUoc3RhdHVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwic3RhdHVzQ2VsbFRhYkluZGV4KHN0YXR1cylcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbWl0U29sdXRpb25DbGljaygkZXZlbnQsIHJvdywgcm93SW5kZXgsIHN0YXR1cywgcHJvYmxlbUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWN0aXZhdGVTdGF0dXNDZWxsRnJvbUtleWJvYXJkKCRldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJhY3RpdmF0ZVN0YXR1c0NlbGxGcm9tS2V5Ym9hcmQoJGV2ZW50LCByb3csIHJvd0luZGV4LCBzdGF0dXMsIHByb2JsZW1JbmRleClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0YXR1c1ByZXNlbnRhdGlvbihzdGF0dXMpIGFzIHByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTnVtYmVyKHByZXNlbnRhdGlvbi5zY29yZSk7IGVsc2UgZmFpbGVkU3RhdHVzVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcmVzdC1zdGF0dXMtYmxvY2stc2NvcmVcIj57eyBwcmVzZW50YXRpb24uc2NvcmUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmVzZW50YXRpb24uc2NvcmVEZXRhaWxzICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdGV4dENvbnRlbnRdPVwic3RhdHVzU2VwYXJhdG9yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcmVzdC1zdGF0dXMtYmxvY2stc2NvcmUtZGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwicHJlc2VudGF0aW9uLnNjb3JlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZmFpbGVkU3RhdHVzVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXNlbnRhdGlvbi5zZWNvbmRhcnkgIT09IHVuZGVmaW5lZDsgZWxzZSBzaW5nbGVTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcmVzdC1zdGF0dXMtYmxvY2stcHJpbWFyeVwiPnt7IHByZXNlbnRhdGlvbi5wcmltYXJ5IHx8ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzdGF0dXNTZXBhcmF0b3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJlc3Qtc3RhdHVzLWJsb2NrLXNlY29uZGFyeVwiPnt7IHByZXNlbnRhdGlvbi5zZWNvbmRhcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVN0YXR1cz57eyBwcmVzZW50YXRpb24ucHJpbWFyeSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0dXM+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNyay1zdGF0dXMtcGxhY2Vob2xkZXItY2VsbCBzcmstLXRleHQtY2VudGVyIHNyay0tbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZW1wdHlTdGF0dXNQbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzaG93RGlydENvbHVtblwiIGNsYXNzPVwic3JrLWRpcnQtY2VsbCBzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICB7eyBjYWxjdWxhdGVEaXJ0UGVyY2VudGFnZShyb3cpIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInNob3dTRUNvbHVtblwiIGNsYXNzPVwic3JrLXNlLWNlbGwgc3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCI+XG4gICAgICAgICAgICAgICAge3sgY2FsY3VsYXRlU0VWYWx1ZShyb3csIHByb2JsZW1TdGF0aXN0aWNzKSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDx0Zm9vdCAqbmdJZj1cInNob3dQcm9ibGVtU3RhdGlzdGljc0Zvb3RlclwiPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb290ZXJSb3cgb2YgcHJvYmxlbVN0YXRpc3RpY3NGb290ZXJSb3dzXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1yb3dcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWxhYmVscyBzcmstLXRleHQtcmlnaHQgc3JrLS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwibGVmdEZvb3RlckNvbHVtbkNvdW50KClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItbGFiZWwgc3JrLS1jLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cImZvb3RlclJvdy50b29sdGlwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBmb290ZXJSb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGF0IG9mIHByb2JsZW1TdGF0aXN0aWNzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLS10ZXh0LWNlbnRlciBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyQ2VsbFByaW1hcnkoZm9vdGVyUm93LmtleSwgc3RhdCkgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyQ2VsbFNlY29uZGFyeShmb290ZXJSb3cua2V5LCBzdGF0KSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0UHJvYmxlbVN0YXRpc3RpY3NGb290ZXJDZWxsU2Vjb25kYXJ5KGZvb3RlclJvdy5rZXksIHN0YXQpIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0RpcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItY2VsbCBzcmstZXh0cmEtc3RhdGlzdGljcy1mb290ZXItY2VsbCBzcmstZGlydC1mb290ZXItY2VsbCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByaW1hcnlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1NFQ29sdW1uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWV4dHJhLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLXNlLWZvb3Rlci1jZWxsIHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItcHJpbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1yb3cgc3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItcHJvYmxlbS1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1sYWJlbHMgc3JrLS10ZXh0LXJpZ2h0IHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImxlZnRGb290ZXJDb2x1bW5Db3VudCgpXCJcbiAgICAgICAgICAgICAgPjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9ibGVtIG9mIGRhdGEucHJvYmxlbXM7IGxldCBwcm9ibGVtSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzcmstcHJvYmxlbS1zdGF0aXN0aWNzLWZvb3Rlci1jZWxsIHNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByb2JsZW0taGVhZGVyIHNyay1wcm9ibGVtLWhlYWRlciBzcmstLXRleHQtY2VudGVyIHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJwcm9ibGVtSGVhZGVyQmFja2dyb3VuZEltYWdlKHByb2JsZW0sIDApXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLS1kaXNwbGF5LWJsb2NrXCI+e3sgcHJvYmxlbUFsaWFzKHByb2JsZW0sIHByb2JsZW1JbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0RpcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItY2VsbCBzcmstZXh0cmEtc3RhdGlzdGljcy1mb290ZXItY2VsbCBzcmstZGlydC1mb290ZXItY2VsbCBzcmstLW5vd3JhcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLXByaW1hcnlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1NFQ29sdW1uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNyay1wcm9ibGVtLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLWV4dHJhLXN0YXRpc3RpY3MtZm9vdGVyLWNlbGwgc3JrLXNlLWZvb3Rlci1jZWxsIHNyay0tbm93cmFwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JrLXByb2JsZW0tc3RhdGlzdGljcy1mb290ZXItcHJpbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFJhbmtsaXN0Q29tcG9uZW50IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZGF0YSE6IFN0YXRpY1JhbmtsaXN0O1xuICBASW5wdXQoKSB0aGVtZTogRW51bVRoZW1lID0gRW51bVRoZW1lLmxpZ2h0O1xuICBASW5wdXQoKSByb3dCb3JkZXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2x1bW5Cb3JkZXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByb3dTdHJpcGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1hdFNya0Fzc2V0VXJsPzogKHVybDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNwbGl0T3JnYW5pemF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbHVtblRpdGxlcz86IFJhbmtsaXN0Q29sdW1uVGl0bGVzO1xuICBASW5wdXQoKSBzdGF0dXNDZWxsUHJlc2V0OiBSYW5rbGlzdFN0YXR1c0NlbGxQcmVzZXQgPSAnY2xhc3NpYyc7XG4gIEBJbnB1dCgpIHN0YXR1c0NvbG9yQXNUZXh0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dQcm9ibGVtU3RhdGlzdGljc0Zvb3RlciA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RGlydENvbHVtbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93U0VDb2x1bW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW1wdHlTdGF0dXNQbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHVzZXJBdmF0YXJQbGFjZW1lbnQ6IFJhbmtsaXN0VXNlckF2YXRhclBsYWNlbWVudCA9ICd1c2VyJztcbiAgQElucHV0KCkgbGFuZ3VhZ2VzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgQE91dHB1dCgpIHVzZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlckNsaWNrUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIHByb2JsZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvYmxlbUNsaWNrUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIHNvbHV0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFNvbHV0aW9uQ2xpY2tQYXlsb2FkPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoU3JrUHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZT86IFNya1Byb2JsZW1IZWFkZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgQENvbnRlbnRDaGlsZChTcmtTdGF0dXNDZWxsVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHN0YXR1c0NlbGxUZW1wbGF0ZT86IFNya1N0YXR1c0NlbGxUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICBAQ29udGVudENoaWxkKFNya1VzZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHVzZXJDZWxsVGVtcGxhdGU/OiBTcmtVc2VyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gIHJlYWRvbmx5IHN1cHBvcnRlZFZlcnNpb25zID0gc3JrU3VwcG9ydGVkVmVyc2lvbnM7XG4gIHJlYWRvbmx5IGZpcnN0Qmxvb2RTdGFyID0gJ1xcdTI2MDUnO1xuICByZWFkb25seSBzdGF0dXNTZXBhcmF0b3IgPSAnICc7XG4gIHJlYWRvbmx5IHByb2JsZW1TdGF0aXN0aWNzRm9vdGVyUm93cyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdhY2NlcHRlZCcsXG4gICAgICBsYWJlbDogJ0FjY2VwdGVkJyxcbiAgICAgIHRvb2x0aXA6ICdOdW1iZXIgb2YgcGFydGljaXBhbnRzIHdobyBzb2x2ZWQgdGhpcyBwcm9ibGVtJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2F0dGVtcHRlZCcsXG4gICAgICBsYWJlbDogJ0F0dGVtcHRlZCcsXG4gICAgICB0b29sdGlwOiAnTnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aG8gYXR0ZW1wdGVkIHRoaXMgcHJvYmxlbScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdzdWJtaXR0ZWQnLFxuICAgICAgbGFiZWw6ICdTdWJtaXR0ZWQnLFxuICAgICAgdG9vbHRpcDogJ1RvdGFsIG51bWJlciBvZiB2YWxpZCBzdWJtaXNzaW9ucyBmb3IgdGhpcyBwcm9ibGVtJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2RpcnQnLFxuICAgICAgbGFiZWw6ICdEaXJ0JyxcbiAgICAgIHRvb2x0aXA6ICdXcm9uZyBzdWJtaXNzaW9ucyBhbW9uZyBwYXJ0aWNpcGFudHMgd2hvIHNvbHZlZCB0aGlzIHByb2JsZW0nLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnc2UnLFxuICAgICAgbGFiZWw6ICdTRScsXG4gICAgICB0b29sdGlwOiAnQXZlcmFnZSBoYXJkbmVzcywgY2FsY3VsYXRlZCBhcyAocGFydGljaXBhbnRzIC0gYWNjZXB0ZWQpIC8gcGFydGljaXBhbnRzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2ZpcnN0QWNjZXB0ZWQnLFxuICAgICAgbGFiZWw6ICdGQiBhdCcsXG4gICAgICB0b29sdGlwOiAnRmlyc3QgQmxvb2QgYXQsIGFsc28ga25vd24gYXMgZmlyc3Qgc29sdmUgdGltZSwgaW4gbWludXRlcycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdsYXN0QWNjZXB0ZWQnLFxuICAgICAgbGFiZWw6ICdMQiBhdCcsXG4gICAgICB0b29sdGlwOiAnTGFzdCBCbG9vZCBhdCwgYWxzbyBrbm93biBhcyBsYXN0IHNvbHZlIHRpbWUsIGluIG1pbnV0ZXMnLFxuICAgIH0sXG4gIF07XG4gIHByaXZhdGUgcHJvYmxlbVN0YXRpc3RpY3NTb3VyY2U/OiBTdGF0aWNSYW5rbGlzdDtcbiAgcHJpdmF0ZSBwcm9ibGVtU3RhdGlzdGljc0NhY2hlPzogUHJvYmxlbVN0YXRpc3RpY3NGb290ZXJbXTtcblxuICBnZXQgcHJvYmxlbVN0YXRpc3RpY3MoKSB7XG4gICAgaWYgKCF0aGlzLnNob3dQcm9ibGVtU3RhdGlzdGljc0Zvb3RlciAmJiAhdGhpcy5zaG93U0VDb2x1bW4pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvYmxlbVN0YXRpc3RpY3NTb3VyY2UgIT09IHRoaXMuZGF0YSB8fCAhdGhpcy5wcm9ibGVtU3RhdGlzdGljc0NhY2hlKSB7XG4gICAgICB0aGlzLnByb2JsZW1TdGF0aXN0aWNzU291cmNlID0gdGhpcy5kYXRhO1xuICAgICAgdGhpcy5wcm9ibGVtU3RhdGlzdGljc0NhY2hlID0gY2FsY3VsYXRlUHJvYmxlbVN0YXRpc3RpY3NGb290ZXIodGhpcy5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvYmxlbVN0YXRpc3RpY3NDYWNoZTtcbiAgfVxuXG4gIGlzU3VwcG9ydGVkVmVyc2lvbigpIHtcbiAgICByZXR1cm4gY2FuaXVzZSh0aGlzLmRhdGEudmVyc2lvbik7XG4gIH1cblxuICBzaG93VGltZUNvbHVtbigpIHtcbiAgICByZXR1cm4gc2hvdWxkU2hvd1RpbWVDb2x1bW4odGhpcy5kYXRhLnJvd3MpO1xuICB9XG5cbiAgc2hvd0F2YXRhckluT3JnYW5pemF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNwbGl0T3JnYW5pemF0aW9uICYmIHRoaXMudXNlckF2YXRhclBsYWNlbWVudCA9PT0gJ29yZ2FuaXphdGlvbic7XG4gIH1cblxuICBsZWZ0Rm9vdGVyQ29sdW1uQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zZXJpZXMubGVuZ3RoICsgMSArIDEgKyAodGhpcy5zaG93VGltZUNvbHVtbigpID8gMSA6IDApICsgKHRoaXMuc3BsaXRPcmdhbml6YXRpb24gPyAxIDogMCk7XG4gIH1cblxuICBnZXRSYW5rVmFsdWVzKHJvdzogU3RhdGljUmFua2xpc3RSb3cpOiBSYW5rVmFsdWVbXSB7XG4gICAgcmV0dXJuIHJvdy5yYW5rVmFsdWVzIHx8IHRoaXMuZGF0YS5zZXJpZXMubWFwKCgpID0+ICh7IHJhbms6IG51bGwsIHNlZ21lbnRJbmRleDogbnVsbCB9KSk7XG4gIH1cblxuICBnZXRSYW5rVGV4dChyYW5rVmFsdWU6IFJhbmtWYWx1ZSwgcm93OiBTdGF0aWNSYW5rbGlzdFJvdykge1xuICAgIHJldHVybiByYW5rVmFsdWUucmFuayA/IHJhbmtWYWx1ZS5yYW5rIDogcm93LnVzZXIub2ZmaWNpYWwgPT09IGZhbHNlID8gJ++8iicgOiAnJztcbiAgfVxuXG4gIHJlc29sdmVEaXNwbGF5VGV4dCh0ZXh0OiBQYXJhbWV0ZXJzPHR5cGVvZiByZXNvbHZlVGV4dD5bMF0pIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRleHQodGV4dCwgdGhpcy5sYW5ndWFnZXMpO1xuICB9XG5cbiAgcmVzb2x2ZVNlcmllc0NvbHVtblRpdGxlKHNlcmllczogc3JrLlJhbmtTZXJpZXMsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZXJpZXNUaXRsZXMgPSB0aGlzLmNvbHVtblRpdGxlcz8uc2VyaWVzO1xuICAgIGlmICh0eXBlb2Ygc2VyaWVzVGl0bGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2VyaWVzVGl0bGVzKHNlcmllcywgaW5kZXgpID8/IHNlcmllcy50aXRsZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2VyaWVzVGl0bGVzKSkge1xuICAgICAgcmV0dXJuIHNlcmllc1RpdGxlc1tpbmRleF0gPz8gc2VyaWVzLnRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWVzLnRpdGxlO1xuICB9XG5cbiAgcmVzb2x2ZUNvbHVtblRpdGxlKGtleTogRXhjbHVkZTxrZXlvZiBSYW5rbGlzdENvbHVtblRpdGxlcywgJ3Nlcmllcyc+LCBmYWxsYmFjazogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVGl0bGVzPy5ba2V5XSA/PyBmYWxsYmFjaztcbiAgfVxuXG4gIHByb2JsZW1BbGlhcyhwcm9ibGVtOiBzcmsuUHJvYmxlbSwgcHJvYmxlbUluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gcHJvYmxlbS5hbGlhcyB8fCBudW1iZXJUb0FscGhhYmV0KHByb2JsZW1JbmRleCk7XG4gIH1cblxuICBwcm9ibGVtU3RhdHNUaXRsZShzdGF0aXN0aWNzOiBzcmsuUHJvYmxlbVN0YXRpc3RpY3MpIHtcbiAgICBjb25zdCByYXRpbyA9IHN0YXRpc3RpY3Muc3VibWl0dGVkID8gKChzdGF0aXN0aWNzLmFjY2VwdGVkIC8gc3RhdGlzdGljcy5zdWJtaXR0ZWQpICogMTAwKS50b0ZpeGVkKDEpIDogMDtcbiAgICByZXR1cm4gYCR7c3RhdGlzdGljcy5hY2NlcHRlZH0gLyAke3N0YXRpc3RpY3Muc3VibWl0dGVkfSAoJHtyYXRpb30lKWA7XG4gIH1cblxuICBwcm9ibGVtSGVhZGVyQmFja2dyb3VuZEltYWdlKHByb2JsZW06IHNyay5Qcm9ibGVtLCBncmFkaWVudERpcmVjdGlvbiA9IDE4MCkge1xuICAgIHJldHVybiBnZXRQcm9ibGVtSGVhZGVyQmFja2dyb3VuZEltYWdlSWZTdHlsZWQocHJvYmxlbS5zdHlsZSwgdGhpcy50aGVtZSwgZ3JhZGllbnREaXJlY3Rpb24pO1xuICB9XG5cbiAgcmVzb2x2ZWRVc2VyTWFya2Vycyh1c2VyOiBzcmsuVXNlcikge1xuICAgIHJldHVybiByZXNvbHZlVXNlck1hcmtlcnModXNlciwgdGhpcy5kYXRhLm1hcmtlcnMpLm1hcCgobWFya2VyKSA9PiAoe1xuICAgICAgbWFya2VyLFxuICAgICAgcHJlc2VudGF0aW9uOiBnZXRNYXJrZXJQcmVzZW50YXRpb24obWFya2VyLCB0aGlzLnRoZW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBmb3JtYXRBc3NldFVybCh1cmw6IHN0cmluZywgZmllbGQ6IHN0cmluZykge1xuICAgIHJldHVybiByZXNvbHZlU3JrQXNzZXRVcmwodXJsLCBmaWVsZCwgdGhpcy5mb3JtYXRTcmtBc3NldFVybCk7XG4gIH1cblxuICBmb3JtYXRUaW1lKHRpbWU6IFBhcmFtZXRlcnM8dHlwZW9mIGZvcm1hdFRpbWVEdXJhdGlvbj5bMF0pIHtcbiAgICByZXR1cm4gZm9ybWF0VGltZUR1cmF0aW9uKHRpbWUsICdtaW4nLCBNYXRoLmZsb29yKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpcnRQZXJjZW50YWdlKHJvdzogU3RhdGljUmFua2xpc3RSb3cpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlRGlydFBlcmNlbnRhZ2Uocm93KTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVNFVmFsdWUocm93OiBTdGF0aWNSYW5rbGlzdFJvdywgcHJvYmxlbVN0YXRpc3RpY3M6IFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyW10pIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU0VWYWx1ZShyb3csIHByb2JsZW1TdGF0aXN0aWNzKTtcbiAgfVxuXG4gIHN0YXR1c1ByZXNlbnRhdGlvbihzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cykge1xuICAgIHJldHVybiBnZXRSYW5rUHJvYmxlbVN0YXR1c0NlbGxQcmVzZW50YXRpb24oc3RhdHVzLCB0aGlzLmRhdGEsIHRoaXMuc3RhdHVzQ2VsbFByZXNldCk7XG4gIH1cblxuICBpc051bWJlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH1cblxuICBnZXRTdGF0dXNTb2x1dGlvbnMoc3RhdHVzOiBzcmsuUmFua1Byb2JsZW1TdGF0dXMpIHtcbiAgICByZXR1cm4gWy4uLihzdGF0dXMuc29sdXRpb25zIHx8IFtdKV0ucmV2ZXJzZSgpO1xuICB9XG5cbiAgc3RhdHVzQ2VsbENsYXNzKHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFsnc3JrLXByZXN0LXN0YXR1cy1ibG9jaycsICdzcmstLXRleHQtY2VudGVyJywgJ3Nyay0tbm93cmFwJ107XG4gICAgaWYgKHRoaXMuaXNTdGF0dXNDbGlja2FibGUoc3RhdHVzKSkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdzcmstLWN1cnNvci1wb2ludGVyJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXR1c0NvbG9yQXNUZXh0KSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3Nyay1wcmVzdC1zdGF0dXMtYmxvY2stY29sb3ItdGV4dCcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRDbGFzc05hbWUgPSBnZXRSYW5rUHJvYmxlbVN0YXR1c0NlbGxDbGFzc05hbWUoc3RhdHVzLCB0aGlzLmRhdGEpO1xuICAgIGlmIChyZXN1bHRDbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaChyZXN1bHRDbGFzc05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG4gIH1cblxuICBpc1N0YXR1c0NsaWNrYWJsZShzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cykge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXR1c1NvbHV0aW9ucyhzdGF0dXMpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBzdGF0dXNDZWxsUm9sZShzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cykge1xuICAgIHJldHVybiB0aGlzLmlzU3RhdHVzQ2xpY2thYmxlKHN0YXR1cykgPyAnYnV0dG9uJyA6IG51bGw7XG4gIH1cblxuICBzdGF0dXNDZWxsVGFiSW5kZXgoc3RhdHVzOiBzcmsuUmFua1Byb2JsZW1TdGF0dXMpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N0YXR1c0NsaWNrYWJsZShzdGF0dXMpID8gMCA6IG51bGw7XG4gIH1cblxuICBoYXNQcm9ibGVtQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICBjb25zdCBlbWl0dGVyID0gdGhpcy5wcm9ibGVtQ2xpY2sgYXMgRXZlbnRFbWl0dGVyPFByb2JsZW1DbGlja1BheWxvYWQ+ICYge1xuICAgICAgb2JzZXJ2ZWQ/OiBib29sZWFuO1xuICAgICAgb2JzZXJ2ZXJzPzogdW5rbm93bltdO1xuICAgIH07XG4gICAgcmV0dXJuIGVtaXR0ZXIub2JzZXJ2ZWQgPT09IHRydWUgfHwgQm9vbGVhbihlbWl0dGVyLm9ic2VydmVycz8ubGVuZ3RoKTtcbiAgfVxuXG4gIHByb2JsZW1IZWFkZXJSb2xlKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1Byb2JsZW1DbGlja0xpc3RlbmVyKCkgPyAnYnV0dG9uJyA6IG51bGw7XG4gIH1cblxuICBwcm9ibGVtSGVhZGVyVGFiSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvYmxlbUNsaWNrTGlzdGVuZXIoKSA/IDAgOiBudWxsO1xuICB9XG5cbiAgYnVpbGRQcm9ibGVtSGVhZGVyQ2VsbENvbnRleHQocHJvYmxlbTogc3JrLlByb2JsZW0sIHByb2JsZW1JbmRleDogbnVtYmVyKTogUHJvYmxlbUhlYWRlckNlbGxUZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHByb2JsZW0sXG4gICAgICBwcm9ibGVtLFxuICAgICAgcHJvYmxlbUluZGV4LFxuICAgICAgaW5kZXg6IHByb2JsZW1JbmRleCxcbiAgICAgIHJhbmtsaXN0OiB0aGlzLmRhdGEsXG4gICAgICBsYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLFxuICAgICAgb25DbGljazogKGV2ZW50PzogTW91c2VFdmVudCkgPT4gdGhpcy5lbWl0UHJvYmxlbUNsaWNrKGV2ZW50LCBwcm9ibGVtLCBwcm9ibGVtSW5kZXgpLFxuICAgIH07XG4gIH1cblxuICBidWlsZFVzZXJDZWxsQ29udGV4dChyb3c6IFN0YXRpY1JhbmtsaXN0Um93LCByb3dJbmRleDogbnVtYmVyKTogVXNlckNlbGxUZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHJvdy51c2VyLFxuICAgICAgdXNlcjogcm93LnVzZXIsXG4gICAgICByb3csXG4gICAgICByb3dJbmRleCxcbiAgICAgIHJhbmtsaXN0OiB0aGlzLmRhdGEsXG4gICAgICBtYXJrZXJzOiB0aGlzLmRhdGEubWFya2VycyxcbiAgICAgIGhpZGVPcmdhbml6YXRpb246IHRoaXMuc3BsaXRPcmdhbml6YXRpb24sXG4gICAgICBoaWRlQXZhdGFyOiB0aGlzLnNob3dBdmF0YXJJbk9yZ2FuaXphdGlvbigpLFxuICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmxhbmd1YWdlcyxcbiAgICAgIG9uQ2xpY2s6IChldmVudD86IE1vdXNlRXZlbnQpID0+IHRoaXMuZW1pdFVzZXJDbGljayhldmVudCwgcm93LCByb3dJbmRleCksXG4gICAgfTtcbiAgfVxuXG4gIGJ1aWxkU3RhdHVzQ2VsbENvbnRleHQoXG4gICAgcm93OiBTdGF0aWNSYW5rbGlzdFJvdyxcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzLFxuICAgIHByb2JsZW1JbmRleDogbnVtYmVyLFxuICApOiBTdGF0dXNDZWxsVGVtcGxhdGVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBzdGF0dXMsXG4gICAgICBzdGF0dXMsXG4gICAgICBwcm9ibGVtOiB0aGlzLmRhdGEucHJvYmxlbXNbcHJvYmxlbUluZGV4XSxcbiAgICAgIHByb2JsZW1JbmRleCxcbiAgICAgIHVzZXI6IHJvdy51c2VyLFxuICAgICAgcm93LFxuICAgICAgcm93SW5kZXgsXG4gICAgICByYW5rbGlzdDogdGhpcy5kYXRhLFxuICAgICAgc29sdXRpb25zOiB0aGlzLmdldFN0YXR1c1NvbHV0aW9ucyhzdGF0dXMpLFxuICAgICAgc3RhdHVzQ2VsbFByZXNldDogdGhpcy5zdGF0dXNDZWxsUHJlc2V0LFxuICAgICAgc3RhdHVzQ29sb3JBc1RleHQ6IHRoaXMuc3RhdHVzQ29sb3JBc1RleHQsXG4gICAgICBlbXB0eVN0YXR1c1BsYWNlaG9sZGVyOiB0aGlzLmVtcHR5U3RhdHVzUGxhY2Vob2xkZXIsXG4gICAgICBsYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLFxuICAgICAgb25DbGljazogKGV2ZW50PzogTW91c2VFdmVudCkgPT4gdGhpcy5lbWl0U29sdXRpb25DbGljayhldmVudCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpLFxuICAgIH07XG4gIH1cblxuICBhY3RpdmF0ZVVzZXJDZWxsRnJvbUtleWJvYXJkKGV2ZW50OiBFdmVudCwgcm93OiBTdGF0aWNSYW5rbGlzdFJvdywgcm93SW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbWl0VXNlckNsaWNrKHVuZGVmaW5lZCwgcm93LCByb3dJbmRleCk7XG4gIH1cblxuICBhY3RpdmF0ZVByb2JsZW1IZWFkZXJGcm9tS2V5Ym9hcmQoZXZlbnQ6IEV2ZW50LCBwcm9ibGVtOiBzcmsuUHJvYmxlbSwgcHJvYmxlbUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuaGFzUHJvYmxlbUNsaWNrTGlzdGVuZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZW1pdFByb2JsZW1DbGljayh1bmRlZmluZWQsIHByb2JsZW0sIHByb2JsZW1JbmRleCk7XG4gIH1cblxuICBhY3RpdmF0ZVN0YXR1c0NlbGxGcm9tS2V5Ym9hcmQoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIHJvdzogU3RhdGljUmFua2xpc3RSb3csXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cyxcbiAgICBwcm9ibGVtSW5kZXg6IG51bWJlcixcbiAgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmVtaXRTb2x1dGlvbkNsaWNrKHVuZGVmaW5lZCwgcm93LCByb3dJbmRleCwgc3RhdHVzLCBwcm9ibGVtSW5kZXgpO1xuICB9XG5cbiAgZW1pdFVzZXJDbGljayhldmVudDogTW91c2VFdmVudCB8IHVuZGVmaW5lZCwgcm93OiBTdGF0aWNSYW5rbGlzdFJvdywgcm93SW5kZXg6IG51bWJlcikge1xuICAgIGlmIChldmVudCkge1xuICAgICAgY2FwdHVyZU1vZGFsVHJpZ2dlclBvaW50RnJvbU1vdXNlRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgc291cmNlOiAndXNlci1jZWxsJyxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgIHVzZXJJZDogcm93LnVzZXIuaWQgfHwgbnVsbCxcbiAgICAgICAgICB1c2VyTmFtZTogdGhpcy5yZXNvbHZlRGlzcGxheVRleHQocm93LnVzZXIubmFtZSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51c2VyQ2xpY2suZW1pdCh7XG4gICAgICB1c2VyOiByb3cudXNlcixcbiAgICAgIHJvdyxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgcmFua2xpc3Q6IHRoaXMuZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIGVtaXRQcm9ibGVtQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQgfCB1bmRlZmluZWQsIHByb2JsZW06IHNyay5Qcm9ibGVtLCBwcm9ibGVtSW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5oYXNQcm9ibGVtQ2xpY2tMaXN0ZW5lcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNhcHR1cmVNb2RhbFRyaWdnZXJQb2ludEZyb21Nb3VzZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgIHNvdXJjZTogJ3Byb2JsZW0taGVhZGVyJyxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHByb2JsZW1JbmRleCxcbiAgICAgICAgICBwcm9ibGVtQWxpYXM6IHByb2JsZW0uYWxpYXMgfHwgbnVsbCxcbiAgICAgICAgICBwcm9ibGVtVGl0bGU6IHRoaXMucmVzb2x2ZURpc3BsYXlUZXh0KHByb2JsZW0udGl0bGUpIHx8IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wcm9ibGVtQ2xpY2suZW1pdCh7XG4gICAgICBwcm9ibGVtLFxuICAgICAgcHJvYmxlbUluZGV4LFxuICAgICAgcmFua2xpc3Q6IHRoaXMuZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIGVtaXRTb2x1dGlvbkNsaWNrKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkLFxuICAgIHJvdzogU3RhdGljUmFua2xpc3RSb3csXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBzdGF0dXM6IHNyay5SYW5rUHJvYmxlbVN0YXR1cyxcbiAgICBwcm9ibGVtSW5kZXg6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3Qgc29sdXRpb25zID0gdGhpcy5nZXRTdGF0dXNTb2x1dGlvbnMoc3RhdHVzKTtcbiAgICBpZiAoIXNvbHV0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjYXB0dXJlTW9kYWxUcmlnZ2VyUG9pbnRGcm9tTW91c2VFdmVudChldmVudCwge1xuICAgICAgICBzb3VyY2U6ICdzdGF0dXMtY2VsbCcsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICByb3dJbmRleCxcbiAgICAgICAgICBwcm9ibGVtSW5kZXgsXG4gICAgICAgICAgcHJvYmxlbUFsaWFzOiB0aGlzLmRhdGEucHJvYmxlbXNbcHJvYmxlbUluZGV4XT8uYWxpYXMgfHwgbnVsbCxcbiAgICAgICAgICBwcm9ibGVtVGl0bGU6IHRoaXMuZGF0YS5wcm9ibGVtc1twcm9ibGVtSW5kZXhdID8gdGhpcy5yZXNvbHZlRGlzcGxheVRleHQodGhpcy5kYXRhLnByb2JsZW1zW3Byb2JsZW1JbmRleF0udGl0bGUpIDogbnVsbCxcbiAgICAgICAgICB1c2VySWQ6IHJvdy51c2VyLmlkIHx8IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2x1dGlvbkNsaWNrLmVtaXQoe1xuICAgICAgdXNlcjogcm93LnVzZXIsXG4gICAgICByb3csXG4gICAgICByb3dJbmRleCxcbiAgICAgIHByb2JsZW1JbmRleCxcbiAgICAgIHByb2JsZW06IHRoaXMuZGF0YS5wcm9ibGVtc1twcm9ibGVtSW5kZXhdLFxuICAgICAgc3RhdHVzLFxuICAgICAgc29sdXRpb25zLFxuICAgICAgcmFua2xpc3Q6IHRoaXMuZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNlcmllc1NlZ21lbnQocmFua1ZhbHVlOiBSYW5rVmFsdWUsIHNlcmllczogc3JrLlJhbmtTZXJpZXMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbmRleCA9IHJhbmtWYWx1ZS5zZWdtZW50SW5kZXggfHwgcmFua1ZhbHVlLnNlZ21lbnRJbmRleCA9PT0gMCA/IHJhbmtWYWx1ZS5zZWdtZW50SW5kZXggOiAtMTtcbiAgICByZXR1cm4gKHNlcmllcz8uc2VnbWVudHMgfHwgW10pW2luZGV4XSB8fCB7fTtcbiAgfVxuXG4gIGlzU2VyaWVzU2VnbWVudGVkQ29sdW1uKHNlcmllczogc3JrLlJhbmtTZXJpZXMgfCB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gKHNlcmllcz8uc2VnbWVudHMgfHwgW10pLnNvbWUoKHNlZ21lbnQpID0+IHR5cGVvZiBzZWdtZW50LnN0eWxlID09PSAnc3RyaW5nJyk7XG4gIH1cblxuICBnZXRTZXJpZXNTZWdtZW50Q2xhc3MocmFua1ZhbHVlOiBSYW5rVmFsdWUsIHNlcmllczogc3JrLlJhbmtTZXJpZXMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzZWdtZW50U3R5bGUgPSB0aGlzLnJlc29sdmVTZXJpZXNTZWdtZW50KHJhbmtWYWx1ZSwgc2VyaWVzKS5zdHlsZTtcbiAgICByZXR1cm4gdHlwZW9mIHNlZ21lbnRTdHlsZSA9PT0gJ3N0cmluZycgPyBgc3JrLXByZXNldC1zZXJpZXMtc2VnbWVudC0ke3NlZ21lbnRTdHlsZX1gIDogJyc7XG4gIH1cblxuICBnZXRTZXJpZXNTZWdtZW50U3R5bGUocmFua1ZhbHVlOiBSYW5rVmFsdWUsIHNlcmllczogc3JrLlJhbmtTZXJpZXMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbXB0eUNvbG9yOiBUaGVtZUNvbG9yID0ge1xuICAgICAgW0VudW1UaGVtZS5saWdodF06IHVuZGVmaW5lZCxcbiAgICAgIFtFbnVtVGhlbWUuZGFya106IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGNvbnN0IHNlZ21lbnRTdHlsZSA9IHRoaXMucmVzb2x2ZVNlcmllc1NlZ21lbnQocmFua1ZhbHVlLCBzZXJpZXMpLnN0eWxlO1xuICAgIGlmICghc2VnbWVudFN0eWxlIHx8IHR5cGVvZiBzZWdtZW50U3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNlZ21lbnRTdHlsZSk7XG4gICAgY29uc3QgdGV4dENvbG9yID0gc3R5bGUudGV4dENvbG9yIHx8IGVtcHR5Q29sb3I7XG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yIHx8IGVtcHR5Q29sb3I7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB0ZXh0Q29sb3JbdGhpcy50aGVtZV0sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvclt0aGlzLnRoZW1lXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UHJvYmxlbVN0YXRpc3RpY3NGb290ZXJDZWxsUHJpbWFyeShrZXk6IHN0cmluZywgc3RhdDogUHJvYmxlbVN0YXRpc3RpY3NGb290ZXIpIHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnYWNjZXB0ZWQnOlxuICAgICAgICByZXR1cm4gc3RhdC5hY2NlcHRlZDtcbiAgICAgIGNhc2UgJ2F0dGVtcHRlZCc6XG4gICAgICAgIHJldHVybiBzdGF0LmF0dGVtcHRlZDtcbiAgICAgIGNhc2UgJ3N1Ym1pdHRlZCc6XG4gICAgICAgIHJldHVybiBzdGF0LnN1Ym1pdHRlZDtcbiAgICAgIGNhc2UgJ2RpcnQnOlxuICAgICAgICByZXR1cm4gc3RhdC5kaXJ0O1xuICAgICAgY2FzZSAnc2UnOlxuICAgICAgICByZXR1cm4gZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NBdmVyYWdlSGFyZG5lc3Moc3RhdCk7XG4gICAgICBjYXNlICdmaXJzdEFjY2VwdGVkJzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFByb2JsZW1TdGF0aXN0aWNzQWNjZXB0ZWRNaW51dGUoc3RhdC5maXJzdEFjY2VwdGVkVGltZSk7XG4gICAgICBjYXNlICdsYXN0QWNjZXB0ZWQnOlxuICAgICAgICByZXR1cm4gZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NBY2NlcHRlZE1pbnV0ZShzdGF0Lmxhc3RBY2NlcHRlZFRpbWUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGdldFByb2JsZW1TdGF0aXN0aWNzRm9vdGVyQ2VsbFNlY29uZGFyeShrZXk6IHN0cmluZywgc3RhdDogUHJvYmxlbVN0YXRpc3RpY3NGb290ZXIpIHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnYWNjZXB0ZWQnOlxuICAgICAgICByZXR1cm4gZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NQZXJjZW50KHN0YXQuYWNjZXB0ZWQsIHN0YXQucGFydGljaXBhbnRDb3VudCk7XG4gICAgICBjYXNlICdhdHRlbXB0ZWQnOlxuICAgICAgICByZXR1cm4gZm9ybWF0UHJvYmxlbVN0YXRpc3RpY3NQZXJjZW50KHN0YXQuYXR0ZW1wdGVkLCBzdGF0LnBhcnRpY2lwYW50Q291bnQpO1xuICAgICAgY2FzZSAnZGlydCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRQcm9ibGVtU3RhdGlzdGljc1BlcmNlbnQoc3RhdC5kaXJ0LCBzdGF0LmRpcnRTdWJtaXR0ZWQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -2,7 +2,7 @@ import * as i1 from '@angular/common';
|
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { EventEmitter, ViewChild, Output, Input, Component, inject, TemplateRef, Directive, ContentChild, ChangeDetectionStrategy } from '@angular/core';
|
|
5
|
-
import { ensureModalInteractionTracker, unlockModalBodyScroll, SRK_ANIMATED_MODAL_ROOT_CLASS, resolveModalTransformOrigin, MODAL_ANIMATION_DURATION_MS, lockModalBodyScroll, registerModalFocusScope, unregisterModalFocusScope, formatSolutionTimestamp, getSolutionModalTitle, getSolutionResultMeta, getMarkerPresentation, resolveSrkAssetUrl, formatTeamMemberName, getProgressDurationMinutes, getProgressMaxAvailableMinutes, isProgressEnded, getProgressMetrics, srkSupportedVersions, calculateProblemStatisticsFooter, caniuse, shouldShowTimeColumn,
|
|
5
|
+
import { ensureModalInteractionTracker, unlockModalBodyScroll, SRK_ANIMATED_MODAL_ROOT_CLASS, resolveModalTransformOrigin, MODAL_ANIMATION_DURATION_MS, lockModalBodyScroll, registerModalFocusScope, unregisterModalFocusScope, formatSolutionTimestamp, getSolutionModalTitle, getSolutionResultMeta, getMarkerPresentation, resolveSrkAssetUrl, formatTeamMemberName, getProgressDurationMinutes, getProgressMaxAvailableMinutes, isProgressEnded, getProgressMetrics, srkSupportedVersions, calculateProblemStatisticsFooter, caniuse, shouldShowTimeColumn, getProblemHeaderBackgroundImageIfStyled, calculateDirtPercentage, calculateSEValue, getRankProblemStatusCellPresentation, getRankProblemStatusCellClassName, captureModalTriggerPointFromMouseEvent, formatProblemStatisticsAcceptedMinute, formatProblemStatisticsAverageHardness, formatProblemStatisticsPercent } from '@algoux/standard-ranklist-renderer-component-core';
|
|
6
6
|
import { EnumTheme, resolveUserMarkers, resolveText, secToTimeStr, numberToAlphabet, formatTimeDuration, resolveStyle } from '@algoux/standard-ranklist-utils';
|
|
7
7
|
|
|
8
8
|
class ModalComponent {
|
|
@@ -985,7 +985,7 @@ class RanklistComponent {
|
|
|
985
985
|
return `${statistics.accepted} / ${statistics.submitted} (${ratio}%)`;
|
|
986
986
|
}
|
|
987
987
|
problemHeaderBackgroundImage(problem, gradientDirection = 180) {
|
|
988
|
-
return
|
|
988
|
+
return getProblemHeaderBackgroundImageIfStyled(problem.style, this.theme, gradientDirection);
|
|
989
989
|
}
|
|
990
990
|
resolvedUserMarkers(user) {
|
|
991
991
|
return resolveUserMarkers(user, this.data.markers).map((marker) => ({
|
|
@@ -1022,17 +1022,9 @@ class RanklistComponent {
|
|
|
1022
1022
|
if (this.statusColorAsText) {
|
|
1023
1023
|
classNames.push('srk-prest-status-block-color-text');
|
|
1024
1024
|
}
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
else if (status.result === 'AC') {
|
|
1029
|
-
classNames.push('srk-prest-status-block-accepted');
|
|
1030
|
-
}
|
|
1031
|
-
else if (status.result === '?') {
|
|
1032
|
-
classNames.push('srk-prest-status-block-frozen');
|
|
1033
|
-
}
|
|
1034
|
-
else if (status.result === 'RJ') {
|
|
1035
|
-
classNames.push('srk-prest-status-block-failed');
|
|
1025
|
+
const resultClassName = getRankProblemStatusCellClassName(status, this.data);
|
|
1026
|
+
if (resultClassName) {
|
|
1027
|
+
classNames.push(resultClassName);
|
|
1036
1028
|
}
|
|
1037
1029
|
return classNames.join(' ');
|
|
1038
1030
|
}
|
|
@@ -1450,9 +1442,13 @@ class RanklistComponent {
|
|
|
1450
1442
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
1451
1443
|
<ng-container *ngIf="isNumber(presentation.score); else statusText">
|
|
1452
1444
|
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
1453
|
-
<
|
|
1454
|
-
|
|
1455
|
-
|
|
1445
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
1446
|
+
<span [textContent]="statusSeparator"></span>
|
|
1447
|
+
<span
|
|
1448
|
+
class="srk-prest-status-block-score-details"
|
|
1449
|
+
[textContent]="presentation.scoreDetails"
|
|
1450
|
+
></span>
|
|
1451
|
+
</ng-container>
|
|
1456
1452
|
</ng-container>
|
|
1457
1453
|
<ng-template #statusText>
|
|
1458
1454
|
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
@@ -1475,12 +1471,24 @@ class RanklistComponent {
|
|
|
1475
1471
|
(keydown.space)="activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)"
|
|
1476
1472
|
>
|
|
1477
1473
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
1478
|
-
<ng-container *ngIf="presentation.
|
|
1479
|
-
<span class="srk-prest-status-block-
|
|
1480
|
-
<
|
|
1481
|
-
|
|
1474
|
+
<ng-container *ngIf="isNumber(presentation.score); else failedStatusText">
|
|
1475
|
+
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
1476
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
1477
|
+
<span [textContent]="statusSeparator"></span>
|
|
1478
|
+
<span
|
|
1479
|
+
class="srk-prest-status-block-score-details"
|
|
1480
|
+
[textContent]="presentation.scoreDetails"
|
|
1481
|
+
></span>
|
|
1482
|
+
</ng-container>
|
|
1482
1483
|
</ng-container>
|
|
1483
|
-
<ng-template #
|
|
1484
|
+
<ng-template #failedStatusText>
|
|
1485
|
+
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
1486
|
+
<span class="srk-prest-status-block-primary">{{ presentation.primary || '' }}</span>
|
|
1487
|
+
<span [textContent]="statusSeparator"></span>
|
|
1488
|
+
<span class="srk-prest-status-block-secondary">{{ presentation.secondary }}</span>
|
|
1489
|
+
</ng-container>
|
|
1490
|
+
<ng-template #singleStatus>{{ presentation.primary }}</ng-template>
|
|
1491
|
+
</ng-template>
|
|
1484
1492
|
</ng-container>
|
|
1485
1493
|
</td>
|
|
1486
1494
|
</ng-template>
|
|
@@ -1790,9 +1798,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1790
1798
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
1791
1799
|
<ng-container *ngIf="isNumber(presentation.score); else statusText">
|
|
1792
1800
|
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
1793
|
-
<
|
|
1794
|
-
|
|
1795
|
-
|
|
1801
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
1802
|
+
<span [textContent]="statusSeparator"></span>
|
|
1803
|
+
<span
|
|
1804
|
+
class="srk-prest-status-block-score-details"
|
|
1805
|
+
[textContent]="presentation.scoreDetails"
|
|
1806
|
+
></span>
|
|
1807
|
+
</ng-container>
|
|
1796
1808
|
</ng-container>
|
|
1797
1809
|
<ng-template #statusText>
|
|
1798
1810
|
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
@@ -1815,12 +1827,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1815
1827
|
(keydown.space)="activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)"
|
|
1816
1828
|
>
|
|
1817
1829
|
<ng-container *ngIf="statusPresentation(status) as presentation">
|
|
1818
|
-
<ng-container *ngIf="presentation.
|
|
1819
|
-
<span class="srk-prest-status-block-
|
|
1820
|
-
<
|
|
1821
|
-
|
|
1830
|
+
<ng-container *ngIf="isNumber(presentation.score); else failedStatusText">
|
|
1831
|
+
<span class="srk-prest-status-block-score">{{ presentation.score }}</span>
|
|
1832
|
+
<ng-container *ngIf="presentation.scoreDetails !== undefined">
|
|
1833
|
+
<span [textContent]="statusSeparator"></span>
|
|
1834
|
+
<span
|
|
1835
|
+
class="srk-prest-status-block-score-details"
|
|
1836
|
+
[textContent]="presentation.scoreDetails"
|
|
1837
|
+
></span>
|
|
1838
|
+
</ng-container>
|
|
1822
1839
|
</ng-container>
|
|
1823
|
-
<ng-template #
|
|
1840
|
+
<ng-template #failedStatusText>
|
|
1841
|
+
<ng-container *ngIf="presentation.secondary !== undefined; else singleStatus">
|
|
1842
|
+
<span class="srk-prest-status-block-primary">{{ presentation.primary || '' }}</span>
|
|
1843
|
+
<span [textContent]="statusSeparator"></span>
|
|
1844
|
+
<span class="srk-prest-status-block-secondary">{{ presentation.secondary }}</span>
|
|
1845
|
+
</ng-container>
|
|
1846
|
+
<ng-template #singleStatus>{{ presentation.primary }}</ng-template>
|
|
1847
|
+
</ng-template>
|
|
1824
1848
|
</ng-container>
|
|
1825
1849
|
</td>
|
|
1826
1850
|
</ng-template>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algoux-standard-ranklist-renderer-component-angular.mjs","sources":["../../src/lib/modal/modal.component.ts","../../src/lib/modal/default-solution-modal.component.ts","../../src/lib/modal/default-user-modal.component.ts","../../src/lib/progress/progress-bar.component.ts","../../src/lib/ranklist/problem-header-cell-template.directive.ts","../../src/lib/ranklist/status-cell-template.directive.ts","../../src/lib/ranklist/user-cell-template.directive.ts","../../src/lib/ranklist/ranklist.component.ts","../../src/algoux-standard-ranklist-renderer-component-angular.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n MODAL_ANIMATION_DURATION_MS,\n SRK_ANIMATED_MODAL_ROOT_CLASS,\n ensureModalInteractionTracker,\n lockModalBodyScroll,\n registerModalFocusScope,\n resolveModalTransformOrigin,\n unlockModalBodyScroll,\n unregisterModalFocusScope,\n} from './modal-interactions';\n\nexport type ModalCloseReason = 'mask' | 'close-button' | 'escape';\n\n@Component({\n selector: 'srk-modal',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"shouldRender()\" class=\"srk-modal-root\" [ngClass]=\"rootClasses()\" [attr.data-srk-modal-state]=\"animationState\">\n <div class=\"srk-modal-mask\"></div>\n <div\n class=\"srk-modal-wrap\"\n [ngClass]=\"wrapClassName\"\n tabindex=\"-1\"\n (mousedown)=\"handleMaskMouseDown($event)\"\n >\n <div\n #dialog\n class=\"srk-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title || undefined\"\n data-srk-modal-panel=\"true\"\n tabindex=\"-1\"\n [ngStyle]=\"dialogStyle()\"\n >\n <div class=\"srk-modal-content\">\n <button\n aria-label=\"Close\"\n class=\"srk-modal-close\"\n type=\"button\"\n (click)=\"requestClose('close-button')\"\n >\n <span class=\"srk-modal-close-x\"></span>\n </button>\n <div *ngIf=\"title !== undefined\" class=\"srk-modal-header\">\n <div class=\"srk-modal-title\">{{ title }}</div>\n </div>\n <div class=\"srk-modal-body\">\n <ng-content />\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ModalComponent implements AfterViewChecked, OnChanges, OnDestroy {\n @Input() open = false;\n @Input() title?: string;\n @Input() width?: number;\n @Input() rootClassName?: string;\n @Input() wrapClassName?: string;\n @Input() destroyOnClose = true;\n @Input() closeOnEsc = true;\n @Input() closeOnMaskClick = true;\n @Input() panelStyle: Record<string, string | number> = {};\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n @ViewChild('dialog') dialogRef?: ElementRef<HTMLDivElement>;\n\n isMounted = this.open || !this.destroyOnClose;\n animationState: 'pre-open' | 'opening' | 'closing' = this.open ? 'pre-open' : 'closing';\n transformOrigin = { x: 0, y: 0 };\n private closeTimer: number | null = null;\n private openTimer: number | null = null;\n private bodyScrollLocked = false;\n private focusScopeId: number | null = null;\n\n constructor() {\n if (typeof document !== 'undefined') {\n ensureModalInteractionTracker();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['open'] || changes['destroyOnClose']) {\n this.syncOpenState();\n }\n }\n\n ngAfterViewChecked() {\n if (this.open) {\n this.registerFocusScope();\n }\n }\n\n ngOnDestroy() {\n this.clearTimers();\n this.releaseFocusScope();\n if (this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n handleEscape(event?: KeyboardEvent) {\n if (this.open && this.closeOnEsc) {\n this.requestClose('escape');\n }\n }\n\n handleMaskMouseDown(event: MouseEvent) {\n if (this.closeOnMaskClick && event.target === event.currentTarget) {\n this.requestClose('mask');\n }\n }\n\n requestClose(reason: ModalCloseReason) {\n this.openChange.emit(false);\n this.close.emit(reason);\n }\n\n shouldRender() {\n return this.isMounted || !this.destroyOnClose;\n }\n\n rootClasses() {\n return [SRK_ANIMATED_MODAL_ROOT_CLASS, this.rootClassName].filter(Boolean);\n }\n\n dialogStyle() {\n return {\n ...this.panelStyle,\n width: this.width ? `${this.width}px` : this.panelStyle?.['width'],\n '--srk-modal-origin-x': `${this.transformOrigin.x}px`,\n '--srk-modal-origin-y': `${this.transformOrigin.y}px`,\n '--srk-modal-max-width': this.width\n ? `${this.width}px`\n : typeof this.panelStyle?.['width'] === 'string'\n ? this.panelStyle['width']\n : undefined,\n };\n }\n\n private clearTimers() {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n if (this.openTimer !== null) {\n window.clearTimeout(this.openTimer);\n this.openTimer = null;\n }\n }\n\n private syncOpenState() {\n this.clearTimers();\n\n if (this.open) {\n this.isMounted = true;\n this.transformOrigin = { x: 0, y: 0 };\n this.animationState = 'pre-open';\n if (typeof window !== 'undefined') {\n this.openTimer = window.setTimeout(() => {\n this.registerFocusScope();\n const resolution = resolveModalTransformOrigin(this.dialogRef?.nativeElement || null);\n this.transformOrigin = resolution.origin;\n this.animationState = 'opening';\n this.openTimer = null;\n }, 0);\n }\n } else {\n this.releaseFocusScope();\n this.animationState = 'closing';\n if (!this.destroyOnClose) {\n this.isMounted = true;\n } else if (this.isMounted && typeof window !== 'undefined') {\n this.closeTimer = window.setTimeout(() => {\n this.isMounted = false;\n this.updateBodyScrollLock();\n this.closeTimer = null;\n }, MODAL_ANIMATION_DURATION_MS);\n }\n }\n\n this.updateBodyScrollLock();\n }\n\n private updateBodyScrollLock() {\n const shouldLock = this.open || (this.destroyOnClose && this.isMounted);\n if (shouldLock && !this.bodyScrollLocked) {\n lockModalBodyScroll();\n this.bodyScrollLocked = true;\n return;\n }\n if (!shouldLock && this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n private registerFocusScope() {\n const nextFocusScopeId = registerModalFocusScope(this.dialogRef?.nativeElement || null, {\n onEscape: this.closeOnEsc ? (event) => this.handleEscape(event) : undefined,\n });\n if (this.focusScopeId === null) {\n this.focusScopeId = nextFocusScopeId;\n }\n }\n\n private releaseFocusScope() {\n if (this.focusScopeId !== null) {\n unregisterModalFocusScope(this.focusScopeId);\n this.focusScopeId = null;\n }\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n formatSolutionTimestamp,\n getSolutionModalTitle,\n getSolutionResultMeta,\n type SolutionResultMeta,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\n@Component({\n selector: 'srk-default-solution-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser\"\n [open]=\"open\"\n [title]=\"resolvedTitle()\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <table class=\"srk-common-table srk-solutions-table\">\n <thead>\n <tr>\n <th class=\"srk--text-left\">Result</th>\n <th class=\"srk--text-right\">Time</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let solution of cachedSolutions; let index = index; trackBy: trackBySolution\">\n <td>\n <span\n class=\"srk-solution-result-text\"\n [ngClass]=\"solutionMeta(solution).className\"\n >\n {{ solutionMeta(solution).label }}\n </span>\n </td>\n <td class=\"srk--text-right\">{{ formatSolutionTimestamp(solution) }}</td>\n </tr>\n </tbody>\n </table>\n </srk-modal>\n `,\n})\nexport class DefaultSolutionModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() problem?: srk.Problem;\n @Input() problemIndex = 0;\n @Input() solutions: srk.Solution[] = [];\n @Input() title?: string;\n @Input() width = 320;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-solutions-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n @Input() languages?: readonly string[];\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n readonly formatSolutionTimestamp = formatSolutionTimestamp;\n cachedUser: srk.User | null = null;\n cachedProblem?: srk.Problem;\n cachedProblemIndex = 0;\n cachedSolutions: srk.Solution[] = [];\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n this.cachedProblem = this.problem;\n this.cachedProblemIndex = this.problemIndex;\n this.cachedSolutions = this.solutions;\n }\n }\n\n resolvedTitle() {\n return this.title || (this.cachedUser ? getSolutionModalTitle(this.cachedProblemIndex, this.cachedUser, this.languages) : '');\n }\n\n solutionMeta(solution: srk.Solution): SolutionResultMeta {\n return getSolutionResultMeta(solution.result);\n }\n\n trackBySolution(index: number, solution: srk.Solution) {\n return `${solution.result}_${solution.time?.[0]}_${index}`;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n EnumTheme,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport {\n formatTeamMemberName,\n getMarkerPresentation,\n type MarkerPresentation,\n resolveSrkAssetUrl,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\ninterface ResolvedMarker {\n marker: srk.Marker;\n presentation: MarkerPresentation;\n}\n\n@Component({\n selector: 'srk-default-user-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser as modalUser\"\n [open]=\"open\"\n [title]=\"title\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <div class=\"srk-user-modal-info\">\n <h3 class=\"srk-user-modal-info-user-name\">{{ resolveDisplayText(modalUser.name) }}</h3>\n <p *ngIf=\"modalUser.organization\" class=\"srk-user-modal-info-user-second-name\">\n {{ resolveDisplayText(modalUser.organization) }}\n </p>\n <div class=\"srk-user-modal-info-labels\">\n <span class=\"srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general\">\n {{ modalUser.official === false ? '* 非正式参加者' : '正式参加者' }}\n </span>\n <span\n *ngFor=\"let entry of resolvedMarkers(); trackBy: trackByMarkerId\"\n class=\"srk-user-modal-info-labels-label\"\n [ngClass]=\"entry.presentation.className\"\n [ngStyle]=\"entry.presentation.style\"\n >\n {{ resolveDisplayText(entry.marker.label) }}\n </span>\n </div>\n <div *ngIf=\"modalUser.teamMembers?.length\" class=\"srk-user-modal-info-team-members\">\n <ng-container *ngFor=\"let member of modalUser.teamMembers; let index = index; trackBy: trackByMemberName\">\n <span *ngIf=\"index > 0\" class=\"srk-user-modal-info-team-members-slash\"> / </span>\n <span>{{ formatMemberName(member) }}</span>\n </ng-container>\n </div>\n <div *ngIf=\"modalUser.photo\" class=\"srk-user-modal-info-photo\">\n <img\n [src]=\"formatAssetUrl(modalUser.photo, 'user.photo')\"\n alt=\"User portrait\"\n class=\"srk-user-modal-info-photo-img\"\n />\n </div>\n </div>\n </srk-modal>\n `,\n})\nexport class DefaultUserModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() markers: srk.Marker[] = [];\n @Input() theme = EnumTheme.light;\n @Input() title = 'User Info';\n @Input() width = 420;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-user-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n @Input() languages?: readonly string[];\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n cachedUser: srk.User | null = null;\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n }\n }\n\n resolvedMarkers(): ResolvedMarker[] {\n if (!this.cachedUser) {\n return [];\n }\n return resolveUserMarkers(this.cachedUser, this.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n resolveDisplayText(text: Parameters<typeof resolveText>[0]) {\n return resolveText(text, this.languages);\n }\n\n formatMemberName(member: srk.ExternalUser) {\n return formatTeamMemberName(member, this.languages);\n }\n\n trackByMarkerId(_index: number, entry: ResolvedMarker) {\n return entry.marker.id;\n }\n\n trackByMemberName = (_index: number, member: srk.ExternalUser) => {\n return this.resolveDisplayText(member.name);\n };\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { secToTimeStr } from '@algoux/standard-ranklist-utils';\nimport {\n getProgressDurationMinutes,\n getProgressMaxAvailableMinutes,\n getProgressMetrics,\n isProgressEnded,\n} from './progress-utils';\n\n@Component({\n selector: 'srk-progress-bar',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"srk-progress-bar-container\">\n <div class=\"srk-progress-bar\">\n <div class=\"srk-progress-bar-body\">\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-normal\"\n [style.width.%]=\"progressMetrics().frozenBreakpoint * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().normalInnerPercent\"></div>\n </div>\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-frozen\"\n [style.width.%]=\"(1 - progressMetrics().frozenBreakpoint) * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().frozenInnerPercent\"></div>\n </div>\n </div>\n <div\n *ngIf=\"enableTimeTravel && progressMetrics().supportRegen\"\n class=\"srk-progress-slider-layer\"\n >\n <div\n *ngIf=\"timeTravelIsChanging\"\n class=\"srk-progress-slider-tooltip\"\n [style.left.%]=\"durationMinutes() ? (timeTravelCurrentValue / durationMinutes()) * 100 : 0\"\n >\n {{ timeLabel(timeTravelCurrentValue) }}\n </div>\n <input\n aria-label=\"Time Travel\"\n class=\"srk-progress-slider\"\n min=\"0\"\n step=\"1\"\n type=\"range\"\n [max]=\"durationMinutes()\"\n [title]=\"timeLabel(timeTravelCurrentValue)\"\n [value]=\"timeTravelCurrentValue\"\n (blur)=\"commitTimeTravel()\"\n (input)=\"updateTimeTravelValue($event)\"\n (keydown)=\"beginTimeTravel()\"\n (keyup)=\"commitTimeTravel()\"\n (mousedown)=\"beginTimeTravel()\"\n (mouseup)=\"commitTimeTravel()\"\n (touchend)=\"commitTimeTravel()\"\n (touchstart)=\"beginTimeTravel()\"\n />\n </div>\n </div>\n <div class=\"srk-progress-secondary-area\">\n <div\n class=\"srk-progress-secondary-area-left\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Elapsed: {{ secToTimeStr(progressMetrics().elapsed / 1000) }}\n </div>\n <div class=\"srk-progress-secondary-area-center\">\n <div *ngIf=\"inTimeMachine\" class=\"srk-progress-time-machine-status\">\n <div class=\"srk-progress-time-machine-text\">Time Travel Mode</div>\n </div>\n <div *ngIf=\"!inTimeMachine && live && !isEnded()\" class=\"srk-progress-live-text\">\n Live\n </div>\n <div *ngIf=\"!inTimeMachine && (!live || isEnded())\" style=\"visibility: hidden\">\n SRK\n </div>\n </div>\n <div\n class=\"srk-progress-secondary-area-right\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Remaining: {{ secToTimeStr(progressMetrics().remaining / 1000) }}\n </div>\n </div>\n </div>\n `,\n})\nexport class ProgressBarComponent implements OnInit, OnDestroy {\n @Input({ required: true }) data!: srk.Ranklist;\n @Input() enableTimeTravel = false;\n @Input() live = false;\n @Input() td = 0;\n\n @Output() timeTravel = new EventEmitter<number | null>();\n\n localTime = Date.now();\n inTimeMachine = false;\n timeTravelIsChanging = false;\n timeTravelCurrentValue = 0;\n timeTravelValue: number | null = null;\n\n private liveInterval?: number;\n\n ngOnInit() {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n if (this.live) {\n this.liveInterval = window.setInterval(() => this.handleProgressTimer(), 1000);\n }\n }\n\n ngOnDestroy() {\n if (this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n }\n\n secToTimeStr(seconds: number) {\n return secToTimeStr(Math.round(seconds));\n }\n\n timeLabel(minutes: number) {\n return secToTimeStr(minutes * 60);\n }\n\n durationMinutes() {\n return getProgressDurationMinutes(this.data.contest);\n }\n\n maxAvailableMinutes() {\n return getProgressMaxAvailableMinutes(this.data.contest, this.localTime, this.td);\n }\n\n isEnded() {\n return isProgressEnded(this.data.contest, this.localTime, this.td);\n }\n\n progressMetrics() {\n return getProgressMetrics(\n this.data,\n this.localTime,\n this.td,\n this.timeTravelCurrentValue,\n this.inTimeMachine,\n );\n }\n\n beginTimeTravel() {\n this.timeTravelIsChanging = true;\n this.inTimeMachine = true;\n }\n\n updateTimeTravelValue(event: Event) {\n this.timeTravelCurrentValue = Number((event.target as HTMLInputElement).value);\n }\n\n commitTimeTravel() {\n if (this.timeTravelIsChanging) {\n this.handleTimeTravelChange(this.timeTravelCurrentValue);\n }\n }\n\n private handleProgressTimer() {\n this.localTime = Date.now();\n if (this.isEnded() && this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n if (!this.timeTravelIsChanging && this.timeTravelValue === null) {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n }\n }\n\n private handleTimeTravelChange(value: number) {\n const exited = value >= this.durationMinutes() || value >= this.maxAvailableMinutes();\n this.timeTravel.emit(exited ? null : value * 60 * 1000);\n this.inTimeMachine = !exited;\n this.timeTravelValue = exited ? null : value * 60 * 1000;\n this.timeTravelIsChanging = false;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n ProblemClickPayload,\n StaticRanklist,\n} from '../types';\n\nexport interface ProblemHeaderCellTemplateContext {\n $implicit: srk.Problem;\n problem: srk.Problem;\n problemIndex: number;\n index: number;\n ranklist: StaticRanklist;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkProblemHeaderCell]',\n standalone: true,\n})\nexport class SrkProblemHeaderCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<ProblemHeaderCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkProblemHeaderCellTemplateDirective,\n context: unknown,\n ): context is ProblemHeaderCellTemplateContext {\n return true;\n }\n}\n\nexport type { ProblemClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n RanklistStatusCellPreset,\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n} from '../types';\n\nexport interface StatusCellTemplateContext {\n $implicit: srk.RankProblemStatus;\n status: srk.RankProblemStatus;\n problem: srk.Problem | undefined;\n problemIndex: number;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n solutions: srk.Solution[];\n statusCellPreset?: RanklistStatusCellPreset;\n statusColorAsText?: boolean;\n emptyStatusPlaceholder?: string | null;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkStatusCell]',\n standalone: true,\n})\nexport class SrkStatusCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<StatusCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkStatusCellTemplateDirective,\n context: unknown,\n ): context is StatusCellTemplateContext {\n return true;\n }\n}\n\nexport type { SolutionClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\n\nexport interface UserCellTemplateContext {\n $implicit: srk.User;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n markers: srk.Marker[];\n hideOrganization?: boolean;\n hideAvatar?: boolean;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkUserCell]',\n standalone: true,\n})\nexport class SrkUserCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<UserCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkUserCellTemplateDirective,\n context: unknown,\n ): context is UserCellTemplateContext {\n return true;\n }\n}\n\nexport type { UserClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport {\n EnumTheme,\n formatTimeDuration,\n numberToAlphabet,\n resolveStyle,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport type { ThemeColor } from '@algoux/standard-ranklist-utils';\nimport {\n calculateDirtPercentage,\n calculateProblemStatisticsFooter,\n calculateSEValue,\n caniuse,\n formatProblemStatisticsAcceptedMinute,\n formatProblemStatisticsAverageHardness,\n formatProblemStatisticsPercent,\n getMarkerPresentation,\n getProblemHeaderBackgroundImage,\n getRankProblemStatusCellPresentation,\n resolveSrkAssetUrl,\n shouldShowTimeColumn,\n srkSupportedVersions,\n} from '@algoux/standard-ranklist-renderer-component-core';\nimport type {\n ProblemStatisticsFooter,\n RanklistColumnTitles,\n RanklistStatusCellPreset,\n RanklistUserAvatarPlacement,\n} from '@algoux/standard-ranklist-renderer-component-core';\nimport { captureModalTriggerPointFromMouseEvent } from '../modal/modal-interactions';\nimport type {\n ProblemClickPayload,\n RankValue,\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\nimport {\n SrkProblemHeaderCellTemplateDirective,\n type ProblemHeaderCellTemplateContext,\n} from './problem-header-cell-template.directive';\nimport {\n SrkStatusCellTemplateDirective,\n type StatusCellTemplateContext,\n} from './status-cell-template.directive';\nimport {\n SrkUserCellTemplateDirective,\n type UserCellTemplateContext,\n} from './user-cell-template.directive';\n\n@Component({\n selector: 'srk-ranklist',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"data.type !== 'general'; else versionState\">\n srk type \"{{ data.type }}\" is not supported\n </div>\n\n <ng-template #versionState>\n <div *ngIf=\"!isSupportedVersion(); else ranklistTable\">\n srk version \"{{ data.version }}\" is not supported (current supported: {{ supportedVersions }})\n </div>\n </ng-template>\n\n <ng-template #ranklistTable>\n <div class=\"srk-common-table srk-main\">\n <table\n [class.srk-table-row-bordered]=\"rowBordered\"\n [class.srk-table-column-bordered]=\"columnBordered\"\n [class.srk-table-row-striped]=\"rowStriped\"\n >\n <thead>\n <tr>\n <th\n *ngFor=\"let seriesItem of data.series; let seriesIndex = index\"\n class=\"srk-series-header srk--text-right srk--nowrap\"\n [class.srk-series-segmented-column]=\"isSeriesSegmentedColumn(seriesItem)\"\n >\n {{ resolveSeriesColumnTitle(seriesItem, seriesIndex) }}\n </th>\n <th\n *ngIf=\"splitOrganization\"\n class=\"srk-organization-header srk--text-left srk--nowrap\"\n >\n {{ resolveColumnTitle('organization', 'Organization') }}\n </th>\n <th class=\"srk--text-left srk--nowrap\">{{ resolveColumnTitle('user', 'Name') }}</th>\n <th class=\"srk--text-right srk--nowrap\">{{ resolveColumnTitle('score', 'Score') }}</th>\n <th *ngIf=\"showTimeColumn()\" class=\"srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('time', 'Time') }}\n </th>\n <ng-container\n *ngFor=\"let problem of data.problems; let problemIndex = index\"\n >\n <ng-container *ngIf=\"problemHeaderCellTemplate; else defaultProblemHeader\">\n <ng-container\n [ngTemplateOutlet]=\"problemHeaderCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildProblemHeaderCellContext(problem, problemIndex)\"\n />\n </ng-container>\n <ng-template #defaultProblemHeader>\n <th\n class=\"srk--nowrap srk-problem-header\"\n [class.srk--cursor-pointer]=\"hasProblemClickListener()\"\n [attr.role]=\"problemHeaderRole()\"\n [attr.tabindex]=\"problemHeaderTabIndex()\"\n [style.background-image]=\"problemHeaderBackgroundImage(problem)\"\n (click)=\"emitProblemClick($event, problem, problemIndex)\"\n (keydown.enter)=\"activateProblemHeaderFromKeyboard($event, problem, problemIndex)\"\n (keydown.space)=\"activateProblemHeaderFromKeyboard($event, problem, problemIndex)\"\n >\n <a\n *ngIf=\"problem.link && !hasProblemClickListener(); else unlinkedProblemHeader\"\n [href]=\"problem.link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color: unset\"\n >\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </a>\n <ng-template #unlinkedProblemHeader>\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </ng-template>\n </th>\n </ng-template>\n </ng-container>\n <th *ngIf=\"showDirtColumn\" class=\"srk-dirt-header srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('dirt', 'Dirt') }}\n </th>\n <th *ngIf=\"showSEColumn\" class=\"srk-se-header srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('se', 'SE') }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data.rows; let rowIndex = index\">\n <td\n *ngFor=\"let rankValue of getRankValues(row); let seriesIndex = index\"\n class=\"srk--text-right srk--nowrap\"\n [ngClass]=\"getSeriesSegmentClass(rankValue, data.series[seriesIndex])\"\n [class.srk-series-segmented-column]=\"isSeriesSegmentedColumn(data.series[seriesIndex])\"\n [ngStyle]=\"getSeriesSegmentStyle(rankValue, data.series[seriesIndex])\"\n >\n {{ getRankText(rankValue, row) }}\n </td>\n\n <td\n *ngIf=\"splitOrganization\"\n class=\"srk-organization-cell srk--text-left srk--nowrap\"\n [class.srk-organization-cell-avatar]=\"showAvatarInOrganization() && !!row.user.avatar\"\n >\n <div class=\"srk-organization-cell-content\">\n <div *ngIf=\"showAvatarInOrganization() && row.user.avatar\" class=\"srk-user-avatar\">\n <img\n [src]=\"formatAssetUrl(row.user.avatar, 'user.avatar')\"\n alt=\"User Avatar\"\n />\n </div>\n <span\n class=\"srk-organization-name-text\"\n [title]=\"row.user.organization ? resolveDisplayText(row.user.organization) : ''\"\n [textContent]=\"row.user.organization ? resolveDisplayText(row.user.organization) : ''\"\n ></span>\n </div>\n </td>\n\n <ng-container *ngIf=\"userCellTemplate; else defaultUserCell\">\n <ng-container\n [ngTemplateOutlet]=\"userCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildUserCellContext(row, rowIndex)\"\n />\n </ng-container>\n <ng-template #defaultUserCell>\n <td\n class=\"srk--text-left srk--nowrap srk-user-cell srk--cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"emitUserClick($event, row, rowIndex)\"\n (keydown.enter)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n (keydown.space)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n >\n <div class=\"srk-user-cell-content\">\n <div *ngIf=\"row.user.avatar && !showAvatarInOrganization()\" class=\"srk-user-avatar\">\n <img\n [src]=\"formatAssetUrl(row.user.avatar, 'user.avatar')\"\n alt=\"User Avatar\"\n />\n </div>\n <div class=\"srk-user-body\">\n <div class=\"srk-user-name-row\">\n <span\n class=\"srk-user-name-text\"\n [title]=\"resolveDisplayText(row.user.name)\"\n >\n {{ resolveDisplayText(row.user.name) }}\n </span>\n <span class=\"srk-marker-dot-group\">\n <span\n *ngFor=\"let marker of resolvedUserMarkers(row.user)\"\n class=\"srk-marker srk-marker-dot srk--c-tooltip\"\n [ngClass]=\"marker.presentation.className\"\n [ngStyle]=\"marker.presentation.style\"\n [attr.data-tooltip]=\"resolveDisplayText(marker.marker.label)\"\n ></span>\n </span>\n </div>\n <p\n *ngIf=\"row.user.organization && !splitOrganization\"\n class=\"srk-user-secondary-text srk--text-ellipsis\"\n title=\"\"\n >\n {{ resolveDisplayText(row.user.organization) }}\n </p>\n </div>\n </div>\n </td>\n </ng-template>\n\n <td class=\"srk--text-right srk--nowrap\">{{ row.score.value }}</td>\n <td *ngIf=\"showTimeColumn()\" class=\"srk--text-right srk--nowrap\">\n {{ row.score.time ? formatTime(row.score.time) : '-' }}\n </td>\n\n <ng-container *ngFor=\"let status of row.statuses; let problemIndex = index\">\n <ng-container *ngIf=\"statusCellTemplate; else defaultStatusCell\">\n <ng-container\n [ngTemplateOutlet]=\"statusCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildStatusCellContext(row, rowIndex, status, problemIndex)\"\n />\n </ng-container>\n <ng-template #defaultStatusCell>\n <td\n *ngIf=\"status.result === 'FB' || status.result === 'AC'; else failedOrFrozenStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n <span\n *ngIf=\"statusColorAsText && status.result === 'FB'\"\n class=\"srk-prest-status-block-fb-star\"\n [textContent]=\"firstBloodStar\"\n ></span>\n <ng-container *ngIf=\"statusPresentation(status) as presentation\">\n <ng-container *ngIf=\"isNumber(presentation.score); else statusText\">\n <span class=\"srk-prest-status-block-score\">{{ presentation.score }}</span>\n <span class=\"srk-prest-status-block-score-details\">\n {{ presentation.scoreDetails }}\n </span>\n </ng-container>\n <ng-template #statusText>\n <ng-container *ngIf=\"presentation.secondary !== undefined; else singleStatus\">\n <span class=\"srk-prest-status-block-primary\">{{ presentation.primary || '' }}</span>\n <span [textContent]=\"statusSeparator\"></span>\n <span class=\"srk-prest-status-block-secondary\">{{ presentation.secondary }}</span>\n </ng-container>\n <ng-template #singleStatus>{{ presentation.primary }}</ng-template>\n </ng-template>\n </ng-container>\n </td>\n <ng-template #failedOrFrozenStatus>\n <td\n *ngIf=\"status.result === '?' || status.result === 'RJ'; else emptyStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n <ng-container *ngIf=\"statusPresentation(status) as presentation\">\n <ng-container *ngIf=\"presentation.secondary !== undefined; else singleStatus\">\n <span class=\"srk-prest-status-block-primary\">{{ presentation.primary || '' }}</span>\n <span [textContent]=\"statusSeparator\"></span>\n <span class=\"srk-prest-status-block-secondary\">{{ presentation.secondary }}</span>\n </ng-container>\n <ng-template #singleStatus>{{ presentation.primary }}</ng-template>\n </ng-container>\n </td>\n </ng-template>\n <ng-template #emptyStatus>\n <td class=\"srk-status-placeholder-cell srk--text-center srk--nowrap\">\n {{ emptyStatusPlaceholder }}\n </td>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <td *ngIf=\"showDirtColumn\" class=\"srk-dirt-cell srk--text-right srk--nowrap\">\n {{ calculateDirtPercentage(row) }}\n </td>\n <td *ngIf=\"showSEColumn\" class=\"srk-se-cell srk--text-right srk--nowrap\">\n {{ calculateSEValue(row, problemStatistics) }}\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"showProblemStatisticsFooter\">\n <tr\n *ngFor=\"let footerRow of problemStatisticsFooterRows\"\n class=\"srk-problem-statistics-footer-row\"\n >\n <td\n class=\"srk-problem-statistics-footer-labels srk--text-right srk--nowrap\"\n [attr.colspan]=\"leftFooterColumnCount()\"\n >\n <span\n class=\"srk-problem-statistics-footer-label srk--c-tooltip\"\n [attr.data-tooltip]=\"footerRow.tooltip\"\n >\n {{ footerRow.label }}\n </span>\n </td>\n <td\n *ngFor=\"let stat of problemStatistics\"\n class=\"srk-problem-statistics-footer-cell srk--text-center srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\">\n {{ getProblemStatisticsFooterCellPrimary(footerRow.key, stat) }}\n </span>\n <ng-container *ngIf=\"getProblemStatisticsFooterCellSecondary(footerRow.key, stat) !== undefined\">\n <span> </span>\n <span class=\"srk-problem-statistics-footer-secondary\">\n {{ getProblemStatisticsFooterCellSecondary(footerRow.key, stat) }}\n </span>\n </ng-container>\n </td>\n <td\n *ngIf=\"showDirtColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n <td\n *ngIf=\"showSEColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n </tr>\n <tr class=\"srk-problem-statistics-footer-row srk-problem-statistics-footer-problem-label-row\">\n <td\n class=\"srk-problem-statistics-footer-labels srk--text-right srk--nowrap\"\n [attr.colspan]=\"leftFooterColumnCount()\"\n ></td>\n <td\n *ngFor=\"let problem of data.problems; let problemIndex = index\"\n class=\"srk-problem-statistics-footer-cell srk-problem-statistics-footer-problem-header srk-problem-header srk--text-center srk--nowrap\"\n [style.background-image]=\"problemHeaderBackgroundImage(problem, 0)\"\n >\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n </td>\n <td\n *ngIf=\"showDirtColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n <td\n *ngIf=\"showSEColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </ng-template>\n `,\n})\nexport class RanklistComponent {\n @Input({ required: true }) data!: StaticRanklist;\n @Input() theme: EnumTheme = EnumTheme.light;\n @Input() rowBordered = false;\n @Input() columnBordered = false;\n @Input() rowStriped = false;\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n @Input() splitOrganization = false;\n @Input() columnTitles?: RanklistColumnTitles;\n @Input() statusCellPreset: RanklistStatusCellPreset = 'classic';\n @Input() statusColorAsText = false;\n @Input() showProblemStatisticsFooter = false;\n @Input() showDirtColumn = false;\n @Input() showSEColumn = false;\n @Input() emptyStatusPlaceholder: string | null = null;\n @Input() userAvatarPlacement: RanklistUserAvatarPlacement = 'user';\n @Input() languages?: readonly string[];\n\n @Output() userClick = new EventEmitter<UserClickPayload>();\n @Output() problemClick = new EventEmitter<ProblemClickPayload>();\n @Output() solutionClick = new EventEmitter<SolutionClickPayload>();\n\n @ContentChild(SrkProblemHeaderCellTemplateDirective)\n problemHeaderCellTemplate?: SrkProblemHeaderCellTemplateDirective;\n\n @ContentChild(SrkStatusCellTemplateDirective)\n statusCellTemplate?: SrkStatusCellTemplateDirective;\n\n @ContentChild(SrkUserCellTemplateDirective)\n userCellTemplate?: SrkUserCellTemplateDirective;\n\n readonly supportedVersions = srkSupportedVersions;\n readonly firstBloodStar = '\\u2605';\n readonly statusSeparator = ' ';\n readonly problemStatisticsFooterRows = [\n {\n key: 'accepted',\n label: 'Accepted',\n tooltip: 'Number of participants who solved this problem',\n },\n {\n key: 'attempted',\n label: 'Attempted',\n tooltip: 'Number of participants who attempted this problem',\n },\n {\n key: 'submitted',\n label: 'Submitted',\n tooltip: 'Total number of valid submissions for this problem',\n },\n {\n key: 'dirt',\n label: 'Dirt',\n tooltip: 'Wrong submissions among participants who solved this problem',\n },\n {\n key: 'se',\n label: 'SE',\n tooltip: 'Average hardness, calculated as (participants - accepted) / participants',\n },\n {\n key: 'firstAccepted',\n label: 'FB at',\n tooltip: 'First Blood at, also known as first solve time, in minutes',\n },\n {\n key: 'lastAccepted',\n label: 'LB at',\n tooltip: 'Last Blood at, also known as last solve time, in minutes',\n },\n ];\n private problemStatisticsSource?: StaticRanklist;\n private problemStatisticsCache?: ProblemStatisticsFooter[];\n\n get problemStatistics() {\n if (!this.showProblemStatisticsFooter && !this.showSEColumn) {\n return [];\n }\n if (this.problemStatisticsSource !== this.data || !this.problemStatisticsCache) {\n this.problemStatisticsSource = this.data;\n this.problemStatisticsCache = calculateProblemStatisticsFooter(this.data);\n }\n return this.problemStatisticsCache;\n }\n\n isSupportedVersion() {\n return caniuse(this.data.version);\n }\n\n showTimeColumn() {\n return shouldShowTimeColumn(this.data.rows);\n }\n\n showAvatarInOrganization() {\n return this.splitOrganization && this.userAvatarPlacement === 'organization';\n }\n\n leftFooterColumnCount() {\n return this.data.series.length + 1 + 1 + (this.showTimeColumn() ? 1 : 0) + (this.splitOrganization ? 1 : 0);\n }\n\n getRankValues(row: StaticRanklistRow): RankValue[] {\n return row.rankValues || this.data.series.map(() => ({ rank: null, segmentIndex: null }));\n }\n\n getRankText(rankValue: RankValue, row: StaticRanklistRow) {\n return rankValue.rank ? rankValue.rank : row.user.official === false ? '*' : '';\n }\n\n resolveDisplayText(text: Parameters<typeof resolveText>[0]) {\n return resolveText(text, this.languages);\n }\n\n resolveSeriesColumnTitle(series: srk.RankSeries, index: number) {\n const seriesTitles = this.columnTitles?.series;\n if (typeof seriesTitles === 'function') {\n return seriesTitles(series, index) ?? series.title;\n }\n if (Array.isArray(seriesTitles)) {\n return seriesTitles[index] ?? series.title;\n }\n return series.title;\n }\n\n resolveColumnTitle(key: Exclude<keyof RanklistColumnTitles, 'series'>, fallback: string) {\n return this.columnTitles?.[key] ?? fallback;\n }\n\n problemAlias(problem: srk.Problem, problemIndex: number) {\n return problem.alias || numberToAlphabet(problemIndex);\n }\n\n problemStatsTitle(statistics: srk.ProblemStatistics) {\n const ratio = statistics.submitted ? ((statistics.accepted / statistics.submitted) * 100).toFixed(1) : 0;\n return `${statistics.accepted} / ${statistics.submitted} (${ratio}%)`;\n }\n\n problemHeaderBackgroundImage(problem: srk.Problem, gradientDirection = 180) {\n return getProblemHeaderBackgroundImage(problem.style, this.theme, gradientDirection);\n }\n\n resolvedUserMarkers(user: srk.User) {\n return resolveUserMarkers(user, this.data.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n formatTime(time: Parameters<typeof formatTimeDuration>[0]) {\n return formatTimeDuration(time, 'min', Math.floor);\n }\n\n calculateDirtPercentage(row: StaticRanklistRow) {\n return calculateDirtPercentage(row);\n }\n\n calculateSEValue(row: StaticRanklistRow, problemStatistics: ProblemStatisticsFooter[]) {\n return calculateSEValue(row, problemStatistics);\n }\n\n statusPresentation(status: srk.RankProblemStatus) {\n return getRankProblemStatusCellPresentation(status, this.data, this.statusCellPreset);\n }\n\n isNumber(value: unknown): value is number {\n return typeof value === 'number';\n }\n\n getStatusSolutions(status: srk.RankProblemStatus) {\n return [...(status.solutions || [])].reverse();\n }\n\n statusCellClass(status: srk.RankProblemStatus) {\n const classNames = ['srk-prest-status-block', 'srk--text-center', 'srk--nowrap'];\n if (this.isStatusClickable(status)) {\n classNames.push('srk--cursor-pointer');\n }\n if (this.statusColorAsText) {\n classNames.push('srk-prest-status-block-color-text');\n }\n if (status.result === 'FB') {\n classNames.push('srk-prest-status-block-fb');\n } else if (status.result === 'AC') {\n classNames.push('srk-prest-status-block-accepted');\n } else if (status.result === '?') {\n classNames.push('srk-prest-status-block-frozen');\n } else if (status.result === 'RJ') {\n classNames.push('srk-prest-status-block-failed');\n }\n return classNames.join(' ');\n }\n\n isStatusClickable(status: srk.RankProblemStatus) {\n return this.getStatusSolutions(status).length > 0;\n }\n\n statusCellRole(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 'button' : null;\n }\n\n statusCellTabIndex(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 0 : null;\n }\n\n hasProblemClickListener() {\n const emitter = this.problemClick as EventEmitter<ProblemClickPayload> & {\n observed?: boolean;\n observers?: unknown[];\n };\n return emitter.observed === true || Boolean(emitter.observers?.length);\n }\n\n problemHeaderRole() {\n return this.hasProblemClickListener() ? 'button' : null;\n }\n\n problemHeaderTabIndex() {\n return this.hasProblemClickListener() ? 0 : null;\n }\n\n buildProblemHeaderCellContext(problem: srk.Problem, problemIndex: number): ProblemHeaderCellTemplateContext {\n return {\n $implicit: problem,\n problem,\n problemIndex,\n index: problemIndex,\n ranklist: this.data,\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitProblemClick(event, problem, problemIndex),\n };\n }\n\n buildUserCellContext(row: StaticRanklistRow, rowIndex: number): UserCellTemplateContext {\n return {\n $implicit: row.user,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n markers: this.data.markers,\n hideOrganization: this.splitOrganization,\n hideAvatar: this.showAvatarInOrganization(),\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitUserClick(event, row, rowIndex),\n };\n }\n\n buildStatusCellContext(\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ): StatusCellTemplateContext {\n return {\n $implicit: status,\n status,\n problem: this.data.problems[problemIndex],\n problemIndex,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n solutions: this.getStatusSolutions(status),\n statusCellPreset: this.statusCellPreset,\n statusColorAsText: this.statusColorAsText,\n emptyStatusPlaceholder: this.emptyStatusPlaceholder,\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitSolutionClick(event, row, rowIndex, status, problemIndex),\n };\n }\n\n activateUserCellFromKeyboard(event: Event, row: StaticRanklistRow, rowIndex: number) {\n event.preventDefault();\n this.emitUserClick(undefined, row, rowIndex);\n }\n\n activateProblemHeaderFromKeyboard(event: Event, problem: srk.Problem, problemIndex: number) {\n if (!this.hasProblemClickListener()) {\n return;\n }\n event.preventDefault();\n this.emitProblemClick(undefined, problem, problemIndex);\n }\n\n activateStatusCellFromKeyboard(\n event: Event,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n event.preventDefault();\n this.emitSolutionClick(undefined, row, rowIndex, status, problemIndex);\n }\n\n emitUserClick(event: MouseEvent | undefined, row: StaticRanklistRow, rowIndex: number) {\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'user-cell',\n context: {\n rowIndex,\n userId: row.user.id || null,\n userName: this.resolveDisplayText(row.user.name),\n },\n });\n }\n this.userClick.emit({\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n });\n }\n\n emitProblemClick(event: MouseEvent | undefined, problem: srk.Problem, problemIndex: number) {\n if (!this.hasProblemClickListener()) {\n return;\n }\n if (event) {\n event.preventDefault();\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'problem-header',\n context: {\n problemIndex,\n problemAlias: problem.alias || null,\n problemTitle: this.resolveDisplayText(problem.title) || null,\n },\n });\n }\n this.problemClick.emit({\n problem,\n problemIndex,\n ranklist: this.data,\n });\n }\n\n emitSolutionClick(\n event: MouseEvent | undefined,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n const solutions = this.getStatusSolutions(status);\n if (!solutions.length) {\n return;\n }\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'status-cell',\n context: {\n rowIndex,\n problemIndex,\n problemAlias: this.data.problems[problemIndex]?.alias || null,\n problemTitle: this.data.problems[problemIndex] ? this.resolveDisplayText(this.data.problems[problemIndex].title) : null,\n userId: row.user.id || null,\n },\n });\n }\n this.solutionClick.emit({\n user: row.user,\n row,\n rowIndex,\n problemIndex,\n problem: this.data.problems[problemIndex],\n status,\n solutions,\n ranklist: this.data,\n });\n }\n\n private resolveSeriesSegment(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const index = rankValue.segmentIndex || rankValue.segmentIndex === 0 ? rankValue.segmentIndex : -1;\n return (series?.segments || [])[index] || {};\n }\n\n isSeriesSegmentedColumn(series: srk.RankSeries | undefined) {\n return (series?.segments || []).some((segment) => typeof segment.style === 'string');\n }\n\n getSeriesSegmentClass(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n return typeof segmentStyle === 'string' ? `srk-preset-series-segment-${segmentStyle}` : '';\n }\n\n getSeriesSegmentStyle(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const emptyColor: ThemeColor = {\n [EnumTheme.light]: undefined,\n [EnumTheme.dark]: undefined,\n };\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n if (!segmentStyle || typeof segmentStyle === 'string') {\n return {};\n }\n const style = resolveStyle(segmentStyle);\n const textColor = style.textColor || emptyColor;\n const backgroundColor = style.backgroundColor || emptyColor;\n return {\n color: textColor[this.theme],\n backgroundColor: backgroundColor[this.theme],\n };\n }\n\n getProblemStatisticsFooterCellPrimary(key: string, stat: ProblemStatisticsFooter) {\n switch (key) {\n case 'accepted':\n return stat.accepted;\n case 'attempted':\n return stat.attempted;\n case 'submitted':\n return stat.submitted;\n case 'dirt':\n return stat.dirt;\n case 'se':\n return formatProblemStatisticsAverageHardness(stat);\n case 'firstAccepted':\n return formatProblemStatisticsAcceptedMinute(stat.firstAcceptedTime);\n case 'lastAccepted':\n return formatProblemStatisticsAcceptedMinute(stat.lastAcceptedTime);\n default:\n return '';\n }\n }\n\n getProblemStatisticsFooterCellSecondary(key: string, stat: ProblemStatisticsFooter) {\n switch (key) {\n case 'accepted':\n return formatProblemStatisticsPercent(stat.accepted, stat.participantCount);\n case 'attempted':\n return formatProblemStatisticsPercent(stat.attempted, stat.participantCount);\n case 'dirt':\n return formatProblemStatisticsPercent(stat.dirt, stat.dirtSubmitted);\n default:\n return undefined;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"algoux-standard-ranklist-renderer-component-angular.mjs","sources":["../../src/lib/modal/modal.component.ts","../../src/lib/modal/default-solution-modal.component.ts","../../src/lib/modal/default-user-modal.component.ts","../../src/lib/progress/progress-bar.component.ts","../../src/lib/ranklist/problem-header-cell-template.directive.ts","../../src/lib/ranklist/status-cell-template.directive.ts","../../src/lib/ranklist/user-cell-template.directive.ts","../../src/lib/ranklist/ranklist.component.ts","../../src/algoux-standard-ranklist-renderer-component-angular.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n MODAL_ANIMATION_DURATION_MS,\n SRK_ANIMATED_MODAL_ROOT_CLASS,\n ensureModalInteractionTracker,\n lockModalBodyScroll,\n registerModalFocusScope,\n resolveModalTransformOrigin,\n unlockModalBodyScroll,\n unregisterModalFocusScope,\n} from './modal-interactions';\n\nexport type ModalCloseReason = 'mask' | 'close-button' | 'escape';\n\n@Component({\n selector: 'srk-modal',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"shouldRender()\" class=\"srk-modal-root\" [ngClass]=\"rootClasses()\" [attr.data-srk-modal-state]=\"animationState\">\n <div class=\"srk-modal-mask\"></div>\n <div\n class=\"srk-modal-wrap\"\n [ngClass]=\"wrapClassName\"\n tabindex=\"-1\"\n (mousedown)=\"handleMaskMouseDown($event)\"\n >\n <div\n #dialog\n class=\"srk-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title || undefined\"\n data-srk-modal-panel=\"true\"\n tabindex=\"-1\"\n [ngStyle]=\"dialogStyle()\"\n >\n <div class=\"srk-modal-content\">\n <button\n aria-label=\"Close\"\n class=\"srk-modal-close\"\n type=\"button\"\n (click)=\"requestClose('close-button')\"\n >\n <span class=\"srk-modal-close-x\"></span>\n </button>\n <div *ngIf=\"title !== undefined\" class=\"srk-modal-header\">\n <div class=\"srk-modal-title\">{{ title }}</div>\n </div>\n <div class=\"srk-modal-body\">\n <ng-content />\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ModalComponent implements AfterViewChecked, OnChanges, OnDestroy {\n @Input() open = false;\n @Input() title?: string;\n @Input() width?: number;\n @Input() rootClassName?: string;\n @Input() wrapClassName?: string;\n @Input() destroyOnClose = true;\n @Input() closeOnEsc = true;\n @Input() closeOnMaskClick = true;\n @Input() panelStyle: Record<string, string | number> = {};\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n @ViewChild('dialog') dialogRef?: ElementRef<HTMLDivElement>;\n\n isMounted = this.open || !this.destroyOnClose;\n animationState: 'pre-open' | 'opening' | 'closing' = this.open ? 'pre-open' : 'closing';\n transformOrigin = { x: 0, y: 0 };\n private closeTimer: number | null = null;\n private openTimer: number | null = null;\n private bodyScrollLocked = false;\n private focusScopeId: number | null = null;\n\n constructor() {\n if (typeof document !== 'undefined') {\n ensureModalInteractionTracker();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['open'] || changes['destroyOnClose']) {\n this.syncOpenState();\n }\n }\n\n ngAfterViewChecked() {\n if (this.open) {\n this.registerFocusScope();\n }\n }\n\n ngOnDestroy() {\n this.clearTimers();\n this.releaseFocusScope();\n if (this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n handleEscape(event?: KeyboardEvent) {\n if (this.open && this.closeOnEsc) {\n this.requestClose('escape');\n }\n }\n\n handleMaskMouseDown(event: MouseEvent) {\n if (this.closeOnMaskClick && event.target === event.currentTarget) {\n this.requestClose('mask');\n }\n }\n\n requestClose(reason: ModalCloseReason) {\n this.openChange.emit(false);\n this.close.emit(reason);\n }\n\n shouldRender() {\n return this.isMounted || !this.destroyOnClose;\n }\n\n rootClasses() {\n return [SRK_ANIMATED_MODAL_ROOT_CLASS, this.rootClassName].filter(Boolean);\n }\n\n dialogStyle() {\n return {\n ...this.panelStyle,\n width: this.width ? `${this.width}px` : this.panelStyle?.['width'],\n '--srk-modal-origin-x': `${this.transformOrigin.x}px`,\n '--srk-modal-origin-y': `${this.transformOrigin.y}px`,\n '--srk-modal-max-width': this.width\n ? `${this.width}px`\n : typeof this.panelStyle?.['width'] === 'string'\n ? this.panelStyle['width']\n : undefined,\n };\n }\n\n private clearTimers() {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n if (this.openTimer !== null) {\n window.clearTimeout(this.openTimer);\n this.openTimer = null;\n }\n }\n\n private syncOpenState() {\n this.clearTimers();\n\n if (this.open) {\n this.isMounted = true;\n this.transformOrigin = { x: 0, y: 0 };\n this.animationState = 'pre-open';\n if (typeof window !== 'undefined') {\n this.openTimer = window.setTimeout(() => {\n this.registerFocusScope();\n const resolution = resolveModalTransformOrigin(this.dialogRef?.nativeElement || null);\n this.transformOrigin = resolution.origin;\n this.animationState = 'opening';\n this.openTimer = null;\n }, 0);\n }\n } else {\n this.releaseFocusScope();\n this.animationState = 'closing';\n if (!this.destroyOnClose) {\n this.isMounted = true;\n } else if (this.isMounted && typeof window !== 'undefined') {\n this.closeTimer = window.setTimeout(() => {\n this.isMounted = false;\n this.updateBodyScrollLock();\n this.closeTimer = null;\n }, MODAL_ANIMATION_DURATION_MS);\n }\n }\n\n this.updateBodyScrollLock();\n }\n\n private updateBodyScrollLock() {\n const shouldLock = this.open || (this.destroyOnClose && this.isMounted);\n if (shouldLock && !this.bodyScrollLocked) {\n lockModalBodyScroll();\n this.bodyScrollLocked = true;\n return;\n }\n if (!shouldLock && this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n private registerFocusScope() {\n const nextFocusScopeId = registerModalFocusScope(this.dialogRef?.nativeElement || null, {\n onEscape: this.closeOnEsc ? (event) => this.handleEscape(event) : undefined,\n });\n if (this.focusScopeId === null) {\n this.focusScopeId = nextFocusScopeId;\n }\n }\n\n private releaseFocusScope() {\n if (this.focusScopeId !== null) {\n unregisterModalFocusScope(this.focusScopeId);\n this.focusScopeId = null;\n }\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n formatSolutionTimestamp,\n getSolutionModalTitle,\n getSolutionResultMeta,\n type SolutionResultMeta,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\n@Component({\n selector: 'srk-default-solution-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser\"\n [open]=\"open\"\n [title]=\"resolvedTitle()\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <table class=\"srk-common-table srk-solutions-table\">\n <thead>\n <tr>\n <th class=\"srk--text-left\">Result</th>\n <th class=\"srk--text-right\">Time</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let solution of cachedSolutions; let index = index; trackBy: trackBySolution\">\n <td>\n <span\n class=\"srk-solution-result-text\"\n [ngClass]=\"solutionMeta(solution).className\"\n >\n {{ solutionMeta(solution).label }}\n </span>\n </td>\n <td class=\"srk--text-right\">{{ formatSolutionTimestamp(solution) }}</td>\n </tr>\n </tbody>\n </table>\n </srk-modal>\n `,\n})\nexport class DefaultSolutionModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() problem?: srk.Problem;\n @Input() problemIndex = 0;\n @Input() solutions: srk.Solution[] = [];\n @Input() title?: string;\n @Input() width = 320;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-solutions-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n @Input() languages?: readonly string[];\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n readonly formatSolutionTimestamp = formatSolutionTimestamp;\n cachedUser: srk.User | null = null;\n cachedProblem?: srk.Problem;\n cachedProblemIndex = 0;\n cachedSolutions: srk.Solution[] = [];\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n this.cachedProblem = this.problem;\n this.cachedProblemIndex = this.problemIndex;\n this.cachedSolutions = this.solutions;\n }\n }\n\n resolvedTitle() {\n return this.title || (this.cachedUser ? getSolutionModalTitle(this.cachedProblemIndex, this.cachedUser, this.languages) : '');\n }\n\n solutionMeta(solution: srk.Solution): SolutionResultMeta {\n return getSolutionResultMeta(solution.result);\n }\n\n trackBySolution(index: number, solution: srk.Solution) {\n return `${solution.result}_${solution.time?.[0]}_${index}`;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n EnumTheme,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport {\n formatTeamMemberName,\n getMarkerPresentation,\n type MarkerPresentation,\n resolveSrkAssetUrl,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\ninterface ResolvedMarker {\n marker: srk.Marker;\n presentation: MarkerPresentation;\n}\n\n@Component({\n selector: 'srk-default-user-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser as modalUser\"\n [open]=\"open\"\n [title]=\"title\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <div class=\"srk-user-modal-info\">\n <h3 class=\"srk-user-modal-info-user-name\">{{ resolveDisplayText(modalUser.name) }}</h3>\n <p *ngIf=\"modalUser.organization\" class=\"srk-user-modal-info-user-second-name\">\n {{ resolveDisplayText(modalUser.organization) }}\n </p>\n <div class=\"srk-user-modal-info-labels\">\n <span class=\"srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general\">\n {{ modalUser.official === false ? '* 非正式参加者' : '正式参加者' }}\n </span>\n <span\n *ngFor=\"let entry of resolvedMarkers(); trackBy: trackByMarkerId\"\n class=\"srk-user-modal-info-labels-label\"\n [ngClass]=\"entry.presentation.className\"\n [ngStyle]=\"entry.presentation.style\"\n >\n {{ resolveDisplayText(entry.marker.label) }}\n </span>\n </div>\n <div *ngIf=\"modalUser.teamMembers?.length\" class=\"srk-user-modal-info-team-members\">\n <ng-container *ngFor=\"let member of modalUser.teamMembers; let index = index; trackBy: trackByMemberName\">\n <span *ngIf=\"index > 0\" class=\"srk-user-modal-info-team-members-slash\"> / </span>\n <span>{{ formatMemberName(member) }}</span>\n </ng-container>\n </div>\n <div *ngIf=\"modalUser.photo\" class=\"srk-user-modal-info-photo\">\n <img\n [src]=\"formatAssetUrl(modalUser.photo, 'user.photo')\"\n alt=\"User portrait\"\n class=\"srk-user-modal-info-photo-img\"\n />\n </div>\n </div>\n </srk-modal>\n `,\n})\nexport class DefaultUserModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() markers: srk.Marker[] = [];\n @Input() theme = EnumTheme.light;\n @Input() title = 'User Info';\n @Input() width = 420;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-user-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n @Input() languages?: readonly string[];\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n cachedUser: srk.User | null = null;\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n }\n }\n\n resolvedMarkers(): ResolvedMarker[] {\n if (!this.cachedUser) {\n return [];\n }\n return resolveUserMarkers(this.cachedUser, this.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n resolveDisplayText(text: Parameters<typeof resolveText>[0]) {\n return resolveText(text, this.languages);\n }\n\n formatMemberName(member: srk.ExternalUser) {\n return formatTeamMemberName(member, this.languages);\n }\n\n trackByMarkerId(_index: number, entry: ResolvedMarker) {\n return entry.marker.id;\n }\n\n trackByMemberName = (_index: number, member: srk.ExternalUser) => {\n return this.resolveDisplayText(member.name);\n };\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { secToTimeStr } from '@algoux/standard-ranklist-utils';\nimport {\n getProgressDurationMinutes,\n getProgressMaxAvailableMinutes,\n getProgressMetrics,\n isProgressEnded,\n} from './progress-utils';\n\n@Component({\n selector: 'srk-progress-bar',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"srk-progress-bar-container\">\n <div class=\"srk-progress-bar\">\n <div class=\"srk-progress-bar-body\">\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-normal\"\n [style.width.%]=\"progressMetrics().frozenBreakpoint * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().normalInnerPercent\"></div>\n </div>\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-frozen\"\n [style.width.%]=\"(1 - progressMetrics().frozenBreakpoint) * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().frozenInnerPercent\"></div>\n </div>\n </div>\n <div\n *ngIf=\"enableTimeTravel && progressMetrics().supportRegen\"\n class=\"srk-progress-slider-layer\"\n >\n <div\n *ngIf=\"timeTravelIsChanging\"\n class=\"srk-progress-slider-tooltip\"\n [style.left.%]=\"durationMinutes() ? (timeTravelCurrentValue / durationMinutes()) * 100 : 0\"\n >\n {{ timeLabel(timeTravelCurrentValue) }}\n </div>\n <input\n aria-label=\"Time Travel\"\n class=\"srk-progress-slider\"\n min=\"0\"\n step=\"1\"\n type=\"range\"\n [max]=\"durationMinutes()\"\n [title]=\"timeLabel(timeTravelCurrentValue)\"\n [value]=\"timeTravelCurrentValue\"\n (blur)=\"commitTimeTravel()\"\n (input)=\"updateTimeTravelValue($event)\"\n (keydown)=\"beginTimeTravel()\"\n (keyup)=\"commitTimeTravel()\"\n (mousedown)=\"beginTimeTravel()\"\n (mouseup)=\"commitTimeTravel()\"\n (touchend)=\"commitTimeTravel()\"\n (touchstart)=\"beginTimeTravel()\"\n />\n </div>\n </div>\n <div class=\"srk-progress-secondary-area\">\n <div\n class=\"srk-progress-secondary-area-left\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Elapsed: {{ secToTimeStr(progressMetrics().elapsed / 1000) }}\n </div>\n <div class=\"srk-progress-secondary-area-center\">\n <div *ngIf=\"inTimeMachine\" class=\"srk-progress-time-machine-status\">\n <div class=\"srk-progress-time-machine-text\">Time Travel Mode</div>\n </div>\n <div *ngIf=\"!inTimeMachine && live && !isEnded()\" class=\"srk-progress-live-text\">\n Live\n </div>\n <div *ngIf=\"!inTimeMachine && (!live || isEnded())\" style=\"visibility: hidden\">\n SRK\n </div>\n </div>\n <div\n class=\"srk-progress-secondary-area-right\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Remaining: {{ secToTimeStr(progressMetrics().remaining / 1000) }}\n </div>\n </div>\n </div>\n `,\n})\nexport class ProgressBarComponent implements OnInit, OnDestroy {\n @Input({ required: true }) data!: srk.Ranklist;\n @Input() enableTimeTravel = false;\n @Input() live = false;\n @Input() td = 0;\n\n @Output() timeTravel = new EventEmitter<number | null>();\n\n localTime = Date.now();\n inTimeMachine = false;\n timeTravelIsChanging = false;\n timeTravelCurrentValue = 0;\n timeTravelValue: number | null = null;\n\n private liveInterval?: number;\n\n ngOnInit() {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n if (this.live) {\n this.liveInterval = window.setInterval(() => this.handleProgressTimer(), 1000);\n }\n }\n\n ngOnDestroy() {\n if (this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n }\n\n secToTimeStr(seconds: number) {\n return secToTimeStr(Math.round(seconds));\n }\n\n timeLabel(minutes: number) {\n return secToTimeStr(minutes * 60);\n }\n\n durationMinutes() {\n return getProgressDurationMinutes(this.data.contest);\n }\n\n maxAvailableMinutes() {\n return getProgressMaxAvailableMinutes(this.data.contest, this.localTime, this.td);\n }\n\n isEnded() {\n return isProgressEnded(this.data.contest, this.localTime, this.td);\n }\n\n progressMetrics() {\n return getProgressMetrics(\n this.data,\n this.localTime,\n this.td,\n this.timeTravelCurrentValue,\n this.inTimeMachine,\n );\n }\n\n beginTimeTravel() {\n this.timeTravelIsChanging = true;\n this.inTimeMachine = true;\n }\n\n updateTimeTravelValue(event: Event) {\n this.timeTravelCurrentValue = Number((event.target as HTMLInputElement).value);\n }\n\n commitTimeTravel() {\n if (this.timeTravelIsChanging) {\n this.handleTimeTravelChange(this.timeTravelCurrentValue);\n }\n }\n\n private handleProgressTimer() {\n this.localTime = Date.now();\n if (this.isEnded() && this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n if (!this.timeTravelIsChanging && this.timeTravelValue === null) {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n }\n }\n\n private handleTimeTravelChange(value: number) {\n const exited = value >= this.durationMinutes() || value >= this.maxAvailableMinutes();\n this.timeTravel.emit(exited ? null : value * 60 * 1000);\n this.inTimeMachine = !exited;\n this.timeTravelValue = exited ? null : value * 60 * 1000;\n this.timeTravelIsChanging = false;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n ProblemClickPayload,\n StaticRanklist,\n} from '../types';\n\nexport interface ProblemHeaderCellTemplateContext {\n $implicit: srk.Problem;\n problem: srk.Problem;\n problemIndex: number;\n index: number;\n ranklist: StaticRanklist;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkProblemHeaderCell]',\n standalone: true,\n})\nexport class SrkProblemHeaderCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<ProblemHeaderCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkProblemHeaderCellTemplateDirective,\n context: unknown,\n ): context is ProblemHeaderCellTemplateContext {\n return true;\n }\n}\n\nexport type { ProblemClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n RanklistStatusCellPreset,\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n} from '../types';\n\nexport interface StatusCellTemplateContext {\n $implicit: srk.RankProblemStatus;\n status: srk.RankProblemStatus;\n problem: srk.Problem | undefined;\n problemIndex: number;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n solutions: srk.Solution[];\n statusCellPreset?: RanklistStatusCellPreset;\n statusColorAsText?: boolean;\n emptyStatusPlaceholder?: string | null;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkStatusCell]',\n standalone: true,\n})\nexport class SrkStatusCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<StatusCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkStatusCellTemplateDirective,\n context: unknown,\n ): context is StatusCellTemplateContext {\n return true;\n }\n}\n\nexport type { SolutionClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\n\nexport interface UserCellTemplateContext {\n $implicit: srk.User;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n markers: srk.Marker[];\n hideOrganization?: boolean;\n hideAvatar?: boolean;\n languages?: readonly string[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkUserCell]',\n standalone: true,\n})\nexport class SrkUserCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<UserCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkUserCellTemplateDirective,\n context: unknown,\n ): context is UserCellTemplateContext {\n return true;\n }\n}\n\nexport type { UserClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport {\n EnumTheme,\n formatTimeDuration,\n numberToAlphabet,\n resolveStyle,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport type { ThemeColor } from '@algoux/standard-ranklist-utils';\nimport {\n calculateDirtPercentage,\n calculateProblemStatisticsFooter,\n calculateSEValue,\n caniuse,\n formatProblemStatisticsAcceptedMinute,\n formatProblemStatisticsAverageHardness,\n formatProblemStatisticsPercent,\n getMarkerPresentation,\n getProblemHeaderBackgroundImageIfStyled,\n getRankProblemStatusCellClassName,\n getRankProblemStatusCellPresentation,\n resolveSrkAssetUrl,\n shouldShowTimeColumn,\n srkSupportedVersions,\n} from '@algoux/standard-ranklist-renderer-component-core';\nimport type {\n ProblemStatisticsFooter,\n RanklistColumnTitles,\n RanklistStatusCellPreset,\n RanklistUserAvatarPlacement,\n} from '@algoux/standard-ranklist-renderer-component-core';\nimport { captureModalTriggerPointFromMouseEvent } from '../modal/modal-interactions';\nimport type {\n ProblemClickPayload,\n RankValue,\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\nimport {\n SrkProblemHeaderCellTemplateDirective,\n type ProblemHeaderCellTemplateContext,\n} from './problem-header-cell-template.directive';\nimport {\n SrkStatusCellTemplateDirective,\n type StatusCellTemplateContext,\n} from './status-cell-template.directive';\nimport {\n SrkUserCellTemplateDirective,\n type UserCellTemplateContext,\n} from './user-cell-template.directive';\n\n@Component({\n selector: 'srk-ranklist',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"data.type !== 'general'; else versionState\">\n srk type \"{{ data.type }}\" is not supported\n </div>\n\n <ng-template #versionState>\n <div *ngIf=\"!isSupportedVersion(); else ranklistTable\">\n srk version \"{{ data.version }}\" is not supported (current supported: {{ supportedVersions }})\n </div>\n </ng-template>\n\n <ng-template #ranklistTable>\n <div class=\"srk-common-table srk-main\">\n <table\n [class.srk-table-row-bordered]=\"rowBordered\"\n [class.srk-table-column-bordered]=\"columnBordered\"\n [class.srk-table-row-striped]=\"rowStriped\"\n >\n <thead>\n <tr>\n <th\n *ngFor=\"let seriesItem of data.series; let seriesIndex = index\"\n class=\"srk-series-header srk--text-right srk--nowrap\"\n [class.srk-series-segmented-column]=\"isSeriesSegmentedColumn(seriesItem)\"\n >\n {{ resolveSeriesColumnTitle(seriesItem, seriesIndex) }}\n </th>\n <th\n *ngIf=\"splitOrganization\"\n class=\"srk-organization-header srk--text-left srk--nowrap\"\n >\n {{ resolveColumnTitle('organization', 'Organization') }}\n </th>\n <th class=\"srk--text-left srk--nowrap\">{{ resolveColumnTitle('user', 'Name') }}</th>\n <th class=\"srk--text-right srk--nowrap\">{{ resolveColumnTitle('score', 'Score') }}</th>\n <th *ngIf=\"showTimeColumn()\" class=\"srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('time', 'Time') }}\n </th>\n <ng-container\n *ngFor=\"let problem of data.problems; let problemIndex = index\"\n >\n <ng-container *ngIf=\"problemHeaderCellTemplate; else defaultProblemHeader\">\n <ng-container\n [ngTemplateOutlet]=\"problemHeaderCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildProblemHeaderCellContext(problem, problemIndex)\"\n />\n </ng-container>\n <ng-template #defaultProblemHeader>\n <th\n class=\"srk--nowrap srk-problem-header\"\n [class.srk--cursor-pointer]=\"hasProblemClickListener()\"\n [attr.role]=\"problemHeaderRole()\"\n [attr.tabindex]=\"problemHeaderTabIndex()\"\n [style.background-image]=\"problemHeaderBackgroundImage(problem)\"\n (click)=\"emitProblemClick($event, problem, problemIndex)\"\n (keydown.enter)=\"activateProblemHeaderFromKeyboard($event, problem, problemIndex)\"\n (keydown.space)=\"activateProblemHeaderFromKeyboard($event, problem, problemIndex)\"\n >\n <a\n *ngIf=\"problem.link && !hasProblemClickListener(); else unlinkedProblemHeader\"\n [href]=\"problem.link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color: unset\"\n >\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </a>\n <ng-template #unlinkedProblemHeader>\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </ng-template>\n </th>\n </ng-template>\n </ng-container>\n <th *ngIf=\"showDirtColumn\" class=\"srk-dirt-header srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('dirt', 'Dirt') }}\n </th>\n <th *ngIf=\"showSEColumn\" class=\"srk-se-header srk--text-right srk--nowrap\">\n {{ resolveColumnTitle('se', 'SE') }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data.rows; let rowIndex = index\">\n <td\n *ngFor=\"let rankValue of getRankValues(row); let seriesIndex = index\"\n class=\"srk--text-right srk--nowrap\"\n [ngClass]=\"getSeriesSegmentClass(rankValue, data.series[seriesIndex])\"\n [class.srk-series-segmented-column]=\"isSeriesSegmentedColumn(data.series[seriesIndex])\"\n [ngStyle]=\"getSeriesSegmentStyle(rankValue, data.series[seriesIndex])\"\n >\n {{ getRankText(rankValue, row) }}\n </td>\n\n <td\n *ngIf=\"splitOrganization\"\n class=\"srk-organization-cell srk--text-left srk--nowrap\"\n [class.srk-organization-cell-avatar]=\"showAvatarInOrganization() && !!row.user.avatar\"\n >\n <div class=\"srk-organization-cell-content\">\n <div *ngIf=\"showAvatarInOrganization() && row.user.avatar\" class=\"srk-user-avatar\">\n <img\n [src]=\"formatAssetUrl(row.user.avatar, 'user.avatar')\"\n alt=\"User Avatar\"\n />\n </div>\n <span\n class=\"srk-organization-name-text\"\n [title]=\"row.user.organization ? resolveDisplayText(row.user.organization) : ''\"\n [textContent]=\"row.user.organization ? resolveDisplayText(row.user.organization) : ''\"\n ></span>\n </div>\n </td>\n\n <ng-container *ngIf=\"userCellTemplate; else defaultUserCell\">\n <ng-container\n [ngTemplateOutlet]=\"userCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildUserCellContext(row, rowIndex)\"\n />\n </ng-container>\n <ng-template #defaultUserCell>\n <td\n class=\"srk--text-left srk--nowrap srk-user-cell srk--cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"emitUserClick($event, row, rowIndex)\"\n (keydown.enter)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n (keydown.space)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n >\n <div class=\"srk-user-cell-content\">\n <div *ngIf=\"row.user.avatar && !showAvatarInOrganization()\" class=\"srk-user-avatar\">\n <img\n [src]=\"formatAssetUrl(row.user.avatar, 'user.avatar')\"\n alt=\"User Avatar\"\n />\n </div>\n <div class=\"srk-user-body\">\n <div class=\"srk-user-name-row\">\n <span\n class=\"srk-user-name-text\"\n [title]=\"resolveDisplayText(row.user.name)\"\n >\n {{ resolveDisplayText(row.user.name) }}\n </span>\n <span class=\"srk-marker-dot-group\">\n <span\n *ngFor=\"let marker of resolvedUserMarkers(row.user)\"\n class=\"srk-marker srk-marker-dot srk--c-tooltip\"\n [ngClass]=\"marker.presentation.className\"\n [ngStyle]=\"marker.presentation.style\"\n [attr.data-tooltip]=\"resolveDisplayText(marker.marker.label)\"\n ></span>\n </span>\n </div>\n <p\n *ngIf=\"row.user.organization && !splitOrganization\"\n class=\"srk-user-secondary-text srk--text-ellipsis\"\n title=\"\"\n >\n {{ resolveDisplayText(row.user.organization) }}\n </p>\n </div>\n </div>\n </td>\n </ng-template>\n\n <td class=\"srk--text-right srk--nowrap\">{{ row.score.value }}</td>\n <td *ngIf=\"showTimeColumn()\" class=\"srk--text-right srk--nowrap\">\n {{ row.score.time ? formatTime(row.score.time) : '-' }}\n </td>\n\n <ng-container *ngFor=\"let status of row.statuses; let problemIndex = index\">\n <ng-container *ngIf=\"statusCellTemplate; else defaultStatusCell\">\n <ng-container\n [ngTemplateOutlet]=\"statusCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildStatusCellContext(row, rowIndex, status, problemIndex)\"\n />\n </ng-container>\n <ng-template #defaultStatusCell>\n <td\n *ngIf=\"status.result === 'FB' || status.result === 'AC'; else failedOrFrozenStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n <span\n *ngIf=\"statusColorAsText && status.result === 'FB'\"\n class=\"srk-prest-status-block-fb-star\"\n [textContent]=\"firstBloodStar\"\n ></span>\n <ng-container *ngIf=\"statusPresentation(status) as presentation\">\n <ng-container *ngIf=\"isNumber(presentation.score); else statusText\">\n <span class=\"srk-prest-status-block-score\">{{ presentation.score }}</span>\n <ng-container *ngIf=\"presentation.scoreDetails !== undefined\">\n <span [textContent]=\"statusSeparator\"></span>\n <span\n class=\"srk-prest-status-block-score-details\"\n [textContent]=\"presentation.scoreDetails\"\n ></span>\n </ng-container>\n </ng-container>\n <ng-template #statusText>\n <ng-container *ngIf=\"presentation.secondary !== undefined; else singleStatus\">\n <span class=\"srk-prest-status-block-primary\">{{ presentation.primary || '' }}</span>\n <span [textContent]=\"statusSeparator\"></span>\n <span class=\"srk-prest-status-block-secondary\">{{ presentation.secondary }}</span>\n </ng-container>\n <ng-template #singleStatus>{{ presentation.primary }}</ng-template>\n </ng-template>\n </ng-container>\n </td>\n <ng-template #failedOrFrozenStatus>\n <td\n *ngIf=\"status.result === '?' || status.result === 'RJ'; else emptyStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n <ng-container *ngIf=\"statusPresentation(status) as presentation\">\n <ng-container *ngIf=\"isNumber(presentation.score); else failedStatusText\">\n <span class=\"srk-prest-status-block-score\">{{ presentation.score }}</span>\n <ng-container *ngIf=\"presentation.scoreDetails !== undefined\">\n <span [textContent]=\"statusSeparator\"></span>\n <span\n class=\"srk-prest-status-block-score-details\"\n [textContent]=\"presentation.scoreDetails\"\n ></span>\n </ng-container>\n </ng-container>\n <ng-template #failedStatusText>\n <ng-container *ngIf=\"presentation.secondary !== undefined; else singleStatus\">\n <span class=\"srk-prest-status-block-primary\">{{ presentation.primary || '' }}</span>\n <span [textContent]=\"statusSeparator\"></span>\n <span class=\"srk-prest-status-block-secondary\">{{ presentation.secondary }}</span>\n </ng-container>\n <ng-template #singleStatus>{{ presentation.primary }}</ng-template>\n </ng-template>\n </ng-container>\n </td>\n </ng-template>\n <ng-template #emptyStatus>\n <td class=\"srk-status-placeholder-cell srk--text-center srk--nowrap\">\n {{ emptyStatusPlaceholder }}\n </td>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <td *ngIf=\"showDirtColumn\" class=\"srk-dirt-cell srk--text-right srk--nowrap\">\n {{ calculateDirtPercentage(row) }}\n </td>\n <td *ngIf=\"showSEColumn\" class=\"srk-se-cell srk--text-right srk--nowrap\">\n {{ calculateSEValue(row, problemStatistics) }}\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"showProblemStatisticsFooter\">\n <tr\n *ngFor=\"let footerRow of problemStatisticsFooterRows\"\n class=\"srk-problem-statistics-footer-row\"\n >\n <td\n class=\"srk-problem-statistics-footer-labels srk--text-right srk--nowrap\"\n [attr.colspan]=\"leftFooterColumnCount()\"\n >\n <span\n class=\"srk-problem-statistics-footer-label srk--c-tooltip\"\n [attr.data-tooltip]=\"footerRow.tooltip\"\n >\n {{ footerRow.label }}\n </span>\n </td>\n <td\n *ngFor=\"let stat of problemStatistics\"\n class=\"srk-problem-statistics-footer-cell srk--text-center srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\">\n {{ getProblemStatisticsFooterCellPrimary(footerRow.key, stat) }}\n </span>\n <ng-container *ngIf=\"getProblemStatisticsFooterCellSecondary(footerRow.key, stat) !== undefined\">\n <span> </span>\n <span class=\"srk-problem-statistics-footer-secondary\">\n {{ getProblemStatisticsFooterCellSecondary(footerRow.key, stat) }}\n </span>\n </ng-container>\n </td>\n <td\n *ngIf=\"showDirtColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n <td\n *ngIf=\"showSEColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n </tr>\n <tr class=\"srk-problem-statistics-footer-row srk-problem-statistics-footer-problem-label-row\">\n <td\n class=\"srk-problem-statistics-footer-labels srk--text-right srk--nowrap\"\n [attr.colspan]=\"leftFooterColumnCount()\"\n ></td>\n <td\n *ngFor=\"let problem of data.problems; let problemIndex = index\"\n class=\"srk-problem-statistics-footer-cell srk-problem-statistics-footer-problem-header srk-problem-header srk--text-center srk--nowrap\"\n [style.background-image]=\"problemHeaderBackgroundImage(problem, 0)\"\n >\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n </td>\n <td\n *ngIf=\"showDirtColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n <td\n *ngIf=\"showSEColumn\"\n class=\"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap\"\n >\n <span class=\"srk-problem-statistics-footer-primary\"></span>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </ng-template>\n `,\n})\nexport class RanklistComponent {\n @Input({ required: true }) data!: StaticRanklist;\n @Input() theme: EnumTheme = EnumTheme.light;\n @Input() rowBordered = false;\n @Input() columnBordered = false;\n @Input() rowStriped = false;\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n @Input() splitOrganization = false;\n @Input() columnTitles?: RanklistColumnTitles;\n @Input() statusCellPreset: RanklistStatusCellPreset = 'classic';\n @Input() statusColorAsText = false;\n @Input() showProblemStatisticsFooter = false;\n @Input() showDirtColumn = false;\n @Input() showSEColumn = false;\n @Input() emptyStatusPlaceholder: string | null = null;\n @Input() userAvatarPlacement: RanklistUserAvatarPlacement = 'user';\n @Input() languages?: readonly string[];\n\n @Output() userClick = new EventEmitter<UserClickPayload>();\n @Output() problemClick = new EventEmitter<ProblemClickPayload>();\n @Output() solutionClick = new EventEmitter<SolutionClickPayload>();\n\n @ContentChild(SrkProblemHeaderCellTemplateDirective)\n problemHeaderCellTemplate?: SrkProblemHeaderCellTemplateDirective;\n\n @ContentChild(SrkStatusCellTemplateDirective)\n statusCellTemplate?: SrkStatusCellTemplateDirective;\n\n @ContentChild(SrkUserCellTemplateDirective)\n userCellTemplate?: SrkUserCellTemplateDirective;\n\n readonly supportedVersions = srkSupportedVersions;\n readonly firstBloodStar = '\\u2605';\n readonly statusSeparator = ' ';\n readonly problemStatisticsFooterRows = [\n {\n key: 'accepted',\n label: 'Accepted',\n tooltip: 'Number of participants who solved this problem',\n },\n {\n key: 'attempted',\n label: 'Attempted',\n tooltip: 'Number of participants who attempted this problem',\n },\n {\n key: 'submitted',\n label: 'Submitted',\n tooltip: 'Total number of valid submissions for this problem',\n },\n {\n key: 'dirt',\n label: 'Dirt',\n tooltip: 'Wrong submissions among participants who solved this problem',\n },\n {\n key: 'se',\n label: 'SE',\n tooltip: 'Average hardness, calculated as (participants - accepted) / participants',\n },\n {\n key: 'firstAccepted',\n label: 'FB at',\n tooltip: 'First Blood at, also known as first solve time, in minutes',\n },\n {\n key: 'lastAccepted',\n label: 'LB at',\n tooltip: 'Last Blood at, also known as last solve time, in minutes',\n },\n ];\n private problemStatisticsSource?: StaticRanklist;\n private problemStatisticsCache?: ProblemStatisticsFooter[];\n\n get problemStatistics() {\n if (!this.showProblemStatisticsFooter && !this.showSEColumn) {\n return [];\n }\n if (this.problemStatisticsSource !== this.data || !this.problemStatisticsCache) {\n this.problemStatisticsSource = this.data;\n this.problemStatisticsCache = calculateProblemStatisticsFooter(this.data);\n }\n return this.problemStatisticsCache;\n }\n\n isSupportedVersion() {\n return caniuse(this.data.version);\n }\n\n showTimeColumn() {\n return shouldShowTimeColumn(this.data.rows);\n }\n\n showAvatarInOrganization() {\n return this.splitOrganization && this.userAvatarPlacement === 'organization';\n }\n\n leftFooterColumnCount() {\n return this.data.series.length + 1 + 1 + (this.showTimeColumn() ? 1 : 0) + (this.splitOrganization ? 1 : 0);\n }\n\n getRankValues(row: StaticRanklistRow): RankValue[] {\n return row.rankValues || this.data.series.map(() => ({ rank: null, segmentIndex: null }));\n }\n\n getRankText(rankValue: RankValue, row: StaticRanklistRow) {\n return rankValue.rank ? rankValue.rank : row.user.official === false ? '*' : '';\n }\n\n resolveDisplayText(text: Parameters<typeof resolveText>[0]) {\n return resolveText(text, this.languages);\n }\n\n resolveSeriesColumnTitle(series: srk.RankSeries, index: number) {\n const seriesTitles = this.columnTitles?.series;\n if (typeof seriesTitles === 'function') {\n return seriesTitles(series, index) ?? series.title;\n }\n if (Array.isArray(seriesTitles)) {\n return seriesTitles[index] ?? series.title;\n }\n return series.title;\n }\n\n resolveColumnTitle(key: Exclude<keyof RanklistColumnTitles, 'series'>, fallback: string) {\n return this.columnTitles?.[key] ?? fallback;\n }\n\n problemAlias(problem: srk.Problem, problemIndex: number) {\n return problem.alias || numberToAlphabet(problemIndex);\n }\n\n problemStatsTitle(statistics: srk.ProblemStatistics) {\n const ratio = statistics.submitted ? ((statistics.accepted / statistics.submitted) * 100).toFixed(1) : 0;\n return `${statistics.accepted} / ${statistics.submitted} (${ratio}%)`;\n }\n\n problemHeaderBackgroundImage(problem: srk.Problem, gradientDirection = 180) {\n return getProblemHeaderBackgroundImageIfStyled(problem.style, this.theme, gradientDirection);\n }\n\n resolvedUserMarkers(user: srk.User) {\n return resolveUserMarkers(user, this.data.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n formatTime(time: Parameters<typeof formatTimeDuration>[0]) {\n return formatTimeDuration(time, 'min', Math.floor);\n }\n\n calculateDirtPercentage(row: StaticRanklistRow) {\n return calculateDirtPercentage(row);\n }\n\n calculateSEValue(row: StaticRanklistRow, problemStatistics: ProblemStatisticsFooter[]) {\n return calculateSEValue(row, problemStatistics);\n }\n\n statusPresentation(status: srk.RankProblemStatus) {\n return getRankProblemStatusCellPresentation(status, this.data, this.statusCellPreset);\n }\n\n isNumber(value: unknown): value is number {\n return typeof value === 'number';\n }\n\n getStatusSolutions(status: srk.RankProblemStatus) {\n return [...(status.solutions || [])].reverse();\n }\n\n statusCellClass(status: srk.RankProblemStatus) {\n const classNames = ['srk-prest-status-block', 'srk--text-center', 'srk--nowrap'];\n if (this.isStatusClickable(status)) {\n classNames.push('srk--cursor-pointer');\n }\n if (this.statusColorAsText) {\n classNames.push('srk-prest-status-block-color-text');\n }\n const resultClassName = getRankProblemStatusCellClassName(status, this.data);\n if (resultClassName) {\n classNames.push(resultClassName);\n }\n return classNames.join(' ');\n }\n\n isStatusClickable(status: srk.RankProblemStatus) {\n return this.getStatusSolutions(status).length > 0;\n }\n\n statusCellRole(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 'button' : null;\n }\n\n statusCellTabIndex(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 0 : null;\n }\n\n hasProblemClickListener() {\n const emitter = this.problemClick as EventEmitter<ProblemClickPayload> & {\n observed?: boolean;\n observers?: unknown[];\n };\n return emitter.observed === true || Boolean(emitter.observers?.length);\n }\n\n problemHeaderRole() {\n return this.hasProblemClickListener() ? 'button' : null;\n }\n\n problemHeaderTabIndex() {\n return this.hasProblemClickListener() ? 0 : null;\n }\n\n buildProblemHeaderCellContext(problem: srk.Problem, problemIndex: number): ProblemHeaderCellTemplateContext {\n return {\n $implicit: problem,\n problem,\n problemIndex,\n index: problemIndex,\n ranklist: this.data,\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitProblemClick(event, problem, problemIndex),\n };\n }\n\n buildUserCellContext(row: StaticRanklistRow, rowIndex: number): UserCellTemplateContext {\n return {\n $implicit: row.user,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n markers: this.data.markers,\n hideOrganization: this.splitOrganization,\n hideAvatar: this.showAvatarInOrganization(),\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitUserClick(event, row, rowIndex),\n };\n }\n\n buildStatusCellContext(\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ): StatusCellTemplateContext {\n return {\n $implicit: status,\n status,\n problem: this.data.problems[problemIndex],\n problemIndex,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n solutions: this.getStatusSolutions(status),\n statusCellPreset: this.statusCellPreset,\n statusColorAsText: this.statusColorAsText,\n emptyStatusPlaceholder: this.emptyStatusPlaceholder,\n languages: this.languages,\n onClick: (event?: MouseEvent) => this.emitSolutionClick(event, row, rowIndex, status, problemIndex),\n };\n }\n\n activateUserCellFromKeyboard(event: Event, row: StaticRanklistRow, rowIndex: number) {\n event.preventDefault();\n this.emitUserClick(undefined, row, rowIndex);\n }\n\n activateProblemHeaderFromKeyboard(event: Event, problem: srk.Problem, problemIndex: number) {\n if (!this.hasProblemClickListener()) {\n return;\n }\n event.preventDefault();\n this.emitProblemClick(undefined, problem, problemIndex);\n }\n\n activateStatusCellFromKeyboard(\n event: Event,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n event.preventDefault();\n this.emitSolutionClick(undefined, row, rowIndex, status, problemIndex);\n }\n\n emitUserClick(event: MouseEvent | undefined, row: StaticRanklistRow, rowIndex: number) {\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'user-cell',\n context: {\n rowIndex,\n userId: row.user.id || null,\n userName: this.resolveDisplayText(row.user.name),\n },\n });\n }\n this.userClick.emit({\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n });\n }\n\n emitProblemClick(event: MouseEvent | undefined, problem: srk.Problem, problemIndex: number) {\n if (!this.hasProblemClickListener()) {\n return;\n }\n if (event) {\n event.preventDefault();\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'problem-header',\n context: {\n problemIndex,\n problemAlias: problem.alias || null,\n problemTitle: this.resolveDisplayText(problem.title) || null,\n },\n });\n }\n this.problemClick.emit({\n problem,\n problemIndex,\n ranklist: this.data,\n });\n }\n\n emitSolutionClick(\n event: MouseEvent | undefined,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n const solutions = this.getStatusSolutions(status);\n if (!solutions.length) {\n return;\n }\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'status-cell',\n context: {\n rowIndex,\n problemIndex,\n problemAlias: this.data.problems[problemIndex]?.alias || null,\n problemTitle: this.data.problems[problemIndex] ? this.resolveDisplayText(this.data.problems[problemIndex].title) : null,\n userId: row.user.id || null,\n },\n });\n }\n this.solutionClick.emit({\n user: row.user,\n row,\n rowIndex,\n problemIndex,\n problem: this.data.problems[problemIndex],\n status,\n solutions,\n ranklist: this.data,\n });\n }\n\n private resolveSeriesSegment(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const index = rankValue.segmentIndex || rankValue.segmentIndex === 0 ? rankValue.segmentIndex : -1;\n return (series?.segments || [])[index] || {};\n }\n\n isSeriesSegmentedColumn(series: srk.RankSeries | undefined) {\n return (series?.segments || []).some((segment) => typeof segment.style === 'string');\n }\n\n getSeriesSegmentClass(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n return typeof segmentStyle === 'string' ? `srk-preset-series-segment-${segmentStyle}` : '';\n }\n\n getSeriesSegmentStyle(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const emptyColor: ThemeColor = {\n [EnumTheme.light]: undefined,\n [EnumTheme.dark]: undefined,\n };\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n if (!segmentStyle || typeof segmentStyle === 'string') {\n return {};\n }\n const style = resolveStyle(segmentStyle);\n const textColor = style.textColor || emptyColor;\n const backgroundColor = style.backgroundColor || emptyColor;\n return {\n color: textColor[this.theme],\n backgroundColor: backgroundColor[this.theme],\n };\n }\n\n getProblemStatisticsFooterCellPrimary(key: string, stat: ProblemStatisticsFooter) {\n switch (key) {\n case 'accepted':\n return stat.accepted;\n case 'attempted':\n return stat.attempted;\n case 'submitted':\n return stat.submitted;\n case 'dirt':\n return stat.dirt;\n case 'se':\n return formatProblemStatisticsAverageHardness(stat);\n case 'firstAccepted':\n return formatProblemStatisticsAcceptedMinute(stat.firstAcceptedTime);\n case 'lastAccepted':\n return formatProblemStatisticsAcceptedMinute(stat.lastAcceptedTime);\n default:\n return '';\n }\n }\n\n getProblemStatisticsFooterCellSecondary(key: string, stat: ProblemStatisticsFooter) {\n switch (key) {\n case 'accepted':\n return formatProblemStatisticsPercent(stat.accepted, stat.participantCount);\n case 'attempted':\n return formatProblemStatisticsPercent(stat.attempted, stat.participantCount);\n case 'dirt':\n return formatProblemStatisticsPercent(stat.dirt, stat.dirtSubmitted);\n default:\n return undefined;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@algoux/standard-ranklist-renderer-component-angular",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "Angular components for Standard Ranklist Renderer Component",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/algoux/standard-ranklist-renderer-component",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@algoux/standard-ranklist-utils": "^0.3.1",
|
|
36
36
|
"tslib": "^2.3.0",
|
|
37
|
-
"@algoux/standard-ranklist-renderer-component-core": "0.6.
|
|
37
|
+
"@algoux/standard-ranklist-renderer-component-core": "0.6.4"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@algoux/standard-ranklist": "*",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"rxjs": "^7.8.1",
|
|
53
53
|
"typescript": "~5.4.5",
|
|
54
54
|
"zone.js": "~0.14.10",
|
|
55
|
-
"@algoux/standard-ranklist-renderer-component-styles": "0.6.
|
|
55
|
+
"@algoux/standard-ranklist-renderer-component-styles": "0.6.2"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"build": "node ./scripts/build.mjs",
|