@snabcentr/client-ui 3.32.4 → 3.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/banner/sc-banner.module.d.ts +2 -1
- package/catalog/category-card/sc-category-card.component.d.ts +0 -6
- package/catalog/hover-image-carousel/{hover-image-carousel.component.d.ts → sc-hover-image-carousel.component.d.ts} +16 -7
- package/catalog/index.d.ts +1 -0
- package/catalog/sc-catalog.module.d.ts +3 -2
- package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +4 -4
- package/esm2022/banner/sc-banner.component.mjs +3 -3
- package/esm2022/banner/sc-banner.module.mjs +4 -3
- package/esm2022/cart/cart-item/sc-cart-item.component.mjs +4 -4
- package/esm2022/catalog/category-card/sc-category-card.component.mjs +4 -11
- package/esm2022/catalog/hover-image-carousel/sc-hover-image-carousel.component.mjs +76 -0
- package/esm2022/catalog/index.mjs +2 -1
- package/esm2022/catalog/price-card/sc-price-card.component.mjs +2 -2
- package/esm2022/catalog/price-card-inline/sc-price-card-inline.component.mjs +4 -4
- package/esm2022/catalog/sc-catalog.module.mjs +8 -5
- package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +5 -6
- package/esm2022/news/news-card/sc-news-card.component.mjs +4 -8
- package/esm2022/news/sc-news.module.mjs +4 -3
- package/esm2022/order/order-item-mobile/sc-order-item-mobile.component.mjs +15 -20
- package/fesm2022/snabcentr-client-ui.mjs +60 -76
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/news/news-card/sc-news-card.component.d.ts +1 -5
- package/news/sc-news.module.d.ts +2 -1
- package/order/order-item-mobile/sc-order-item-mobile.component.d.ts +8 -14
- package/package.json +2 -2
- package/release_notes.tmp +2 -2
- package/styles/tailwind/tailwind.scss +0 -4
- package/esm2022/catalog/hover-image-carousel/hover-image-carousel.component.mjs +0 -76
@@ -1,5 +1,5 @@
|
|
1
1
|
import { InputSignal } from '@angular/core';
|
2
|
-
import {
|
2
|
+
import { ScNewsTile } from '@snabcentr/client-core';
|
3
3
|
import * as i0 from "@angular/core";
|
4
4
|
/**
|
5
5
|
* Компонент карточки новости.
|
@@ -17,10 +17,6 @@ export declare class ScNewsCardComponent {
|
|
17
17
|
* Признак того, что этот компонент отображается на мобильном устройстве.
|
18
18
|
*/
|
19
19
|
readonly isMobile: boolean;
|
20
|
-
/**
|
21
|
-
* Класс с вспомогательными методами для работы с изображениями.
|
22
|
-
*/
|
23
|
-
protected readonly imageHelper: ScImageHelper;
|
24
20
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScNewsCardComponent, never>;
|
25
21
|
static ɵcmp: i0.ɵɵComponentDeclaration<ScNewsCardComponent, "sc-news-card", never, { "news": { "alias": "news"; "required": true; "isSignal": true; }; "href": { "alias": "href"; "required": true; "isSignal": true; }; }, {}, never, never, false, never>;
|
26
22
|
}
|
package/news/sc-news.module.d.ts
CHANGED
@@ -5,11 +5,12 @@ import * as i3 from "@angular/common";
|
|
5
5
|
import * as i4 from "@angular/router";
|
6
6
|
import * as i5 from "../share-button/sc-share-button.module";
|
7
7
|
import * as i6 from "../pipes/sc-format-date";
|
8
|
+
import * as i7 from "@snabcentr/client-core";
|
8
9
|
/**
|
9
10
|
* Модуль работы с новостями.
|
10
11
|
*/
|
11
12
|
export declare class ScNewsModule {
|
12
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScNewsModule, never>;
|
13
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<ScNewsModule, [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent], [typeof i3.CommonModule, typeof i4.RouterModule, typeof i5.ScShareButtonModule, typeof i6.ScFormatDatePipe], [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent]>;
|
14
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ScNewsModule, [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent], [typeof i3.CommonModule, typeof i4.RouterModule, typeof i5.ScShareButtonModule, typeof i6.ScFormatDatePipe, typeof i7.ScMediaImageTransformerPipe], [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent]>;
|
14
15
|
static ɵinj: i0.ɵɵInjectorDeclaration<ScNewsModule>;
|
15
16
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
2
|
-
import { ScCartItem,
|
1
|
+
import { EventEmitter, InputSignal, Signal } from '@angular/core';
|
2
|
+
import { ScCartItem, ScIImage } from '@snabcentr/client-core';
|
3
3
|
import { TuiPreviewDialogService } from '@taiga-ui/kit';
|
4
4
|
import { AbstractScPriceCard } from '../../directives';
|
5
5
|
import * as i0 from "@angular/core";
|
@@ -15,31 +15,25 @@ export declare class ScOrderItemMobileComponent extends AbstractScPriceCard {
|
|
15
15
|
/**
|
16
16
|
* Элемент заказа.
|
17
17
|
*/
|
18
|
-
orderItem
|
18
|
+
readonly orderItem: InputSignal<ScCartItem | undefined>;
|
19
19
|
/**
|
20
20
|
* Событие нажатия на дополнительные действия.
|
21
21
|
*/
|
22
22
|
clickActionsEvent: EventEmitter<void>;
|
23
|
+
/**
|
24
|
+
* Изображение товара в заказе.
|
25
|
+
*/
|
26
|
+
readonly cartImage: Signal<ScIImage | undefined>;
|
23
27
|
/**
|
24
28
|
* Инициирует экземпляр класса {@link ScOrderItemMobileComponent}.
|
25
29
|
*
|
26
30
|
* @param previewDialogService Сервис диалогового окна предварительного просмотра.
|
27
31
|
*/
|
28
32
|
constructor(previewDialogService: TuiPreviewDialogService);
|
29
|
-
/**
|
30
|
-
* Продукт элемента заказа.
|
31
|
-
*/
|
32
|
-
get product(): ScProduct | undefined;
|
33
33
|
/**
|
34
34
|
* Отобразить спецификацию.
|
35
35
|
*/
|
36
36
|
showSpecification(): void;
|
37
|
-
/**
|
38
|
-
* Возвращает ссылку на изображение карточки товара.
|
39
|
-
*
|
40
|
-
* @param product Позиция товара/услуги.
|
41
|
-
*/
|
42
|
-
getCardImage(product: ScProduct): string;
|
43
37
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScOrderItemMobileComponent, never>;
|
44
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderItemMobileComponent, "sc-order-item-mobile", never, { "orderItem": { "alias": "orderItem"; "required": false; }; }, { "clickActionsEvent": "clickActionsEvent"; }, never, never, false, never>;
|
38
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderItemMobileComponent, "sc-order-item-mobile", never, { "orderItem": { "alias": "orderItem"; "required": false; "isSignal": true; }; }, { "clickActionsEvent": "clickActionsEvent"; }, never, never, false, never>;
|
45
39
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@snabcentr/client-ui",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.33.1",
|
4
4
|
"author": "Snabcentr Ltd.",
|
5
5
|
"repository": "https://gitlab.snabcentr.met/web/angular/snabcentr-client-ui-lib",
|
6
6
|
"license": "Commercial",
|
@@ -15,7 +15,7 @@
|
|
15
15
|
"@maskito/core": "^3.2.0",
|
16
16
|
"@ng-web-apis/intersection-observer": "^4.11.1",
|
17
17
|
"@ng-web-apis/common": "^4.11.1",
|
18
|
-
"@snabcentr/client-core": "^2.
|
18
|
+
"@snabcentr/client-core": "^2.54.0",
|
19
19
|
"@taiga-ui/addon-charts": "^4.41.0",
|
20
20
|
"@taiga-ui/addon-commerce": "^4.41.0",
|
21
21
|
"@taiga-ui/cdk": "^4.41.0",
|
package/release_notes.tmp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
## 3.
|
1
|
+
## 3.33.1 (2025-07-03)
|
2
2
|
|
3
3
|
### fixed (1 change)
|
4
4
|
|
5
|
-
- [#
|
5
|
+
- [#11909: Доработан компонент sc-order-item-mobile для отображения skeleton](web_soft/libs/angular/snabcentr-client-ui-lib@8918193b7b5183117a286ea046592eabbd34e7cc) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!296))
|
6
6
|
|
@@ -1,76 +0,0 @@
|
|
1
|
-
import { ChangeDetectionStrategy, Component, HostListener, Input, signal } from '@angular/core';
|
2
|
-
import { TuiHovered, TuiRepeatTimes } from '@taiga-ui/cdk';
|
3
|
-
import { TuiButton } from '@taiga-ui/core';
|
4
|
-
import * as i0 from "@angular/core";
|
5
|
-
/**
|
6
|
-
* Компонент просмотра изображений через событие наведения.
|
7
|
-
*/
|
8
|
-
export class HoverImageCarouselComponent {
|
9
|
-
constructor() {
|
10
|
-
/**
|
11
|
-
* Массив изображений.
|
12
|
-
*/
|
13
|
-
this.images = [];
|
14
|
-
/**
|
15
|
-
* Признак что необходимо отобразить элементы управления.
|
16
|
-
*/
|
17
|
-
this.isShowActions = true;
|
18
|
-
/**
|
19
|
-
* {@link WritableSignal} для отслеживания текущего индекса изображения.
|
20
|
-
*/
|
21
|
-
this.currentIndex = signal(0);
|
22
|
-
}
|
23
|
-
/**
|
24
|
-
* Обработчик события `mousemove.silent`.
|
25
|
-
*
|
26
|
-
* @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
|
27
|
-
* @param target Объект {@link HTMLElement} в котором лежат изображения
|
28
|
-
*/
|
29
|
-
onHover(offsetX, target) {
|
30
|
-
if (this.images.length <= 1 || offsetX < 0) {
|
31
|
-
return;
|
32
|
-
}
|
33
|
-
// new Event().preventDefault
|
34
|
-
const elementWidth = target.offsetWidth;
|
35
|
-
const hoverPercentage = offsetX / elementWidth;
|
36
|
-
const newIndex = Math.floor(hoverPercentage * this.images.length);
|
37
|
-
this.currentIndex.set(newIndex);
|
38
|
-
}
|
39
|
-
/**
|
40
|
-
* Обработчик события `mouseleave.silent`.
|
41
|
-
*/
|
42
|
-
onLeave() {
|
43
|
-
if (this.images.length <= 1) {
|
44
|
-
return;
|
45
|
-
}
|
46
|
-
this.currentIndex.set(0);
|
47
|
-
}
|
48
|
-
/**
|
49
|
-
* Обработчик события наведения указателя мыши на точку.
|
50
|
-
*
|
51
|
-
* @param hovered Признак что указатель мыши наведен на точку.
|
52
|
-
* @param index Индекс изображения, который соответствует точке.
|
53
|
-
*/
|
54
|
-
onDotHovered(hovered, index) {
|
55
|
-
if (hovered) {
|
56
|
-
this.currentIndex.set(index);
|
57
|
-
}
|
58
|
-
}
|
59
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
60
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HoverImageCarouselComponent, isStandalone: true, selector: "sc-hover-image-carousel", inputs: { images: "images", isShowActions: "isShowActions" }, host: { listeners: { "mousemove.silent": "onHover($event.offsetX,$event.target)", "mouseleave.silent": "onLeave()" } }, ngImport: i0, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"], dependencies: [{ kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
61
|
-
}
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HoverImageCarouselComponent, decorators: [{
|
63
|
-
type: Component,
|
64
|
-
args: [{ standalone: true, selector: 'sc-hover-image-carousel', imports: [TuiRepeatTimes, TuiButton, TuiHovered], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"] }]
|
65
|
-
}], propDecorators: { images: [{
|
66
|
-
type: Input
|
67
|
-
}], isShowActions: [{
|
68
|
-
type: Input
|
69
|
-
}], onHover: [{
|
70
|
-
type: HostListener,
|
71
|
-
args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
|
72
|
-
}], onLeave: [{
|
73
|
-
type: HostListener,
|
74
|
-
args: ['mouseleave.silent']
|
75
|
-
}] } });
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUUzQzs7R0FFRztBQVNILE1BQU0sT0FBTywyQkFBMkI7SUFSeEM7UUFTSTs7V0FFRztRQUVJLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFFSSxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUVyQzs7V0FFRztRQUNJLGlCQUFZLEdBQTJCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQTJDM0Q7SUF6Q0c7Ozs7O09BS0c7SUFFSyxPQUFPLENBQUMsT0FBZSxFQUFFLE1BQW1CO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1gsQ0FBQztRQUNELDZCQUE2QjtRQUM3QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFFSyxPQUFPO1FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLFlBQVksQ0FBQyxPQUFnQixFQUFFLEtBQWE7UUFDbEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDOytHQTFEUSwyQkFBMkI7bUdBQTNCLDJCQUEyQix5UUNmeEMsaXpCQTJCQSxxU0RqQmMsY0FBYyw2R0FBRSxTQUFTLG9JQUFFLFVBQVU7OzRGQUt0QywyQkFBMkI7a0JBUnZDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLHlCQUF5QixXQUMxQixDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLG1CQUcvQix1QkFBdUIsQ0FBQyxNQUFNOzhCQU94QyxNQUFNO3NCQURaLEtBQUs7Z0JBT0MsYUFBYTtzQkFEbkIsS0FBSztnQkFlRSxPQUFPO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUM7Z0JBZ0I3RCxPQUFPO3NCQURkLFlBQVk7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHVpSG92ZXJlZCwgVHVpUmVwZWF0VGltZXMgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aUJ1dHRvbiB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0L/RgNC+0YHQvNC+0YLRgNCwINC40LfQvtCx0YDQsNC20LXQvdC40Lkg0YfQtdGA0LXQtyDRgdC+0LHRi9GC0LjQtSDQvdCw0LLQtdC00LXQvdC40Y8uXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1ob3Zlci1pbWFnZS1jYXJvdXNlbCcsXG4gICAgaW1wb3J0czogW1R1aVJlcGVhdFRpbWVzLCBUdWlCdXR0b24sIFR1aUhvdmVyZWRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ob3Zlci1pbWFnZS1jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2hvdmVyLWltYWdlLWNhcm91c2VsLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSG92ZXJJbWFnZUNhcm91c2VsQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQnNCw0YHRgdC40LIg0LjQt9C+0LHRgNCw0LbQtdC90LjQuS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbWFnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRh9GC0L4g0L3QtdC+0LHRhdC+0LTQuNC80L4g0L7RgtC+0LHRgNCw0LfQuNGC0Ywg0Y3Qu9C10LzQtdC90YLRiyDRg9C/0YDQsNCy0LvQtdC90LjRjy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc1Nob3dBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBXcml0YWJsZVNpZ25hbH0g0LTQu9GPINC+0YLRgdC70LXQttC40LLQsNC90LjRjyDRgtC10LrRg9GJ0LXQs9C+INC40L3QtNC10LrRgdCwINC40LfQvtCx0YDQsNC20LXQvdC40Y8uXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnRJbmRleDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INGB0L7QsdGL0YLQuNGPIGBtb3VzZW1vdmUuc2lsZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXRYINCe0YLRgdGC0YPQvyDQutGD0YDRgdC+0YDQsCDQvNGL0YjQuCDQv9C+INC+0YHQuCBYINC+0YIg0LrRgNCw0Y8ge0BsaW5rIEhUTUxFbGVtZW50fS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0INCe0LHRitC10LrRgiB7QGxpbmsgSFRNTEVsZW1lbnR9INCyINC60L7RgtC+0YDQvtC8INC70LXQttCw0YIg0LjQt9C+0LHRgNCw0LbQtdC90LjRj1xuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZS5zaWxlbnQnLCBbJyRldmVudC5vZmZzZXRYJywgJyRldmVudC50YXJnZXQnXSlcbiAgICBwcml2YXRlIG9uSG92ZXIob2Zmc2V0WDogbnVtYmVyLCB0YXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlcy5sZW5ndGggPD0gMSB8fCBvZmZzZXRYIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5ldyBFdmVudCgpLnByZXZlbnREZWZhdWx0XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRhcmdldC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgaG92ZXJQZXJjZW50YWdlID0gb2Zmc2V0WCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBNYXRoLmZsb29yKGhvdmVyUGVyY2VudGFnZSAqIHRoaXMuaW1hZ2VzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldChuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdC+0YLRh9C40Log0YHQvtCx0YvRgtC40Y8gYG1vdXNlbGVhdmUuc2lsZW50YC5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlLnNpbGVudCcpXG4gICAgcHJpdmF0ZSBvbkxlYXZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbWFnZXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldCgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDRgdC+0LHRi9GC0LjRjyDQvdCw0LLQtdC00LXQvdC40Y8g0YPQutCw0LfQsNGC0LXQu9GPINC80YvRiNC4INC90LAg0YLQvtGH0LrRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3ZlcmVkINCf0YDQuNC30L3QsNC6INGH0YLQviDRg9C60LDQt9Cw0YLQtdC70Ywg0LzRi9GI0Lgg0L3QsNCy0LXQtNC10L0g0L3QsCDRgtC+0YfQutGDLlxuICAgICAqIEBwYXJhbSBpbmRleCDQmNC90LTQtdC60YEg0LjQt9C+0LHRgNCw0LbQtdC90LjRjywg0LrQvtGC0L7RgNGL0Lkg0YHQvtC+0YLQstC10YLRgdGC0LLRg9C10YIg0YLQvtGH0LrQtS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25Eb3RIb3ZlcmVkKGhvdmVyZWQ6IGJvb2xlYW4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGhvdmVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bFwiXG4gICAgW2NsYXNzLm1iLTJdPVwiaW1hZ2VzLmxlbmd0aCA8PSAxICYmIGlzU2hvd0FjdGlvbnNcIlxuICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwiJzIwLzE5J1wiXG4+XG4gICAgPGltZ1xuICAgICAgICBbc3JjXT1cImltYWdlc1tjdXJyZW50SW5kZXgoKV1cIlxuICAgICAgICBjbGFzcz1cInNpemUtZnVsbCByb3VuZGVkLXhsIG9iamVjdC1jb250YWluXCJcbiAgICAvPlxuPC9kaXY+XG5cbkBpZiAoaW1hZ2VzLmxlbmd0aCA+IDEgJiYgaXNTaG93QWN0aW9ucykge1xuICAgIDxkaXZcbiAgICAgICAgKG1vdXNlbW92ZS5zaWxlbnQpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleEl0ZW0gb2YgaW1hZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAjZWxlbWVudFxuICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbl9zbWFsbFwiXG4gICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJpbmRleEl0ZW0gPT09IGN1cnJlbnRJbmRleCgpID8gJ3ByaW1hcnknIDogJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgKHR1aUhvdmVyZWRDaGFuZ2UpPVwib25Eb3RIb3ZlcmVkKCRldmVudCwgaW5kZXhJdGVtKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbn1cbiJdfQ==
|