Commit d4dfd31e authored by 郑磊's avatar 郑磊

更新d.ts

parent 0876cde6
Pipeline #830 failed with stages
This source diff could not be displayed because it is too large. You can view the blob instead.
.captcha--slider-bar[data-v-fcfe5ea2]{height:55px;position:relative;margin-top:15px}.captcha--slider-bar--bar[data-v-fcfe5ea2]{height:35px;position:relative;top:5px;background-color:#eee;border-radius:3px;overflow:hidden}.captcha--slider-bar--bar .captcha--slider-bar--active[data-v-fcfe5ea2]{position:absolute;left:0;top:0;height:100%;background-color:#6495ed}.captcha--slider-bar--track[data-v-fcfe5ea2]{background-color:#fff;position:absolute;left:0;top:0;width:55px;height:45px;border-radius:3px;box-shadow:0 0 5px #999;display:flex;justify-content:center;align-items:center}.captcha--slider-bar--track .captcha--slider-bar--track-icon[data-v-fcfe5ea2]{fill:#333;display:block;width:25px;height:25px}.captcha--status-tip[data-v-4b782e10]{position:absolute;left:0;bottom:0;width:100%;display:flex;justify-content:center;align-items:center;color:#fff;font-size:14px;height:30px}.captcha--status-tip .captcha--status-tip--icon[data-v-4b782e10]{fill:#fff;display:block;width:18px;height:18px;margin-right:5px}.captcha--status-tip.captcha--status-tip--success[data-v-4b782e10]{background-color:#39c522}.captcha--status-tip.captcha--status-tip--fail[data-v-4b782e10]{background-color:#ff5d39}.captcha--view[data-v-ef209593]{padding:15px 10px}.captcha--view--content[data-v-ef209593]{position:relative;height:210px;margin-top:15px;overflow:hidden}.captcha--view--tip[data-v-ef209593]{font-size:14px;color:#333;line-height:24px;text-align:center}.captcha--status-tip-enter-active[data-v-ef209593],.captcha--status-tip-appear-active[data-v-ef209593]{transition:transform ease-out .4s}.captcha--status-tip-enter-from[data-v-ef209593],.captcha--status-tip-appear-from[data-v-ef209593]{transform:translateY(100%)}.captcha--status-tip-enter-to[data-v-ef209593],.captcha--status-tip-appear-to[data-v-ef209593]{transform:translateY(0)}.captcha--view--concat--bg[data-v-fd603259]{position:absolute;display:block;width:100%;height:100%}.captcha--view--concat--track[data-v-fd603259]{position:absolute;display:block;left:0;top:0;width:100%;overflow:hidden;background-size:100% auto;background-position:0px 0px}.captcha--view--rotate--bg[data-v-76bb4af9]{position:absolute;display:block;width:100%;height:100%}.captcha--view--rotate--track[data-v-76bb4af9]{position:absolute;display:block;width:100%;height:100%;object-fit:contain}.captcha--view--slider--bg[data-v-8fb0f971]{position:absolute;display:block;width:100%;height:100%}.captcha--view--slider--track[data-v-8fb0f971]{position:absolute;display:block;width:auto;height:100%;left:0;top:0}.captcha--error[data-v-6ba70e16]{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:rgba(255,255,255,.7)}.captcha--error .captcha--error--icon[data-v-6ba70e16]{fill:#1c4c5b;width:80px;height:80px}.captcha--error .captcha--error--text[data-v-6ba70e16]{color:#1c4c5b;font-size:14px;margin-top:12px}.captcha--loading[data-v-edb749e2]{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background-color:rgba(255,255,255,.8)}.captcha--loading .lds-ellipsis[data-v-edb749e2],.captcha--loading .lds-ellipsis div[data-v-edb749e2]{box-sizing:border-box}.captcha--loading .lds-ellipsis[data-v-edb749e2]{color:#1c4c5b;display:inline-block;position:relative;width:80px;height:80px}.captcha--loading .lds-ellipsis div[data-v-edb749e2]{position:absolute;top:33.33333px;width:13.33333px;height:13.33333px;border-radius:50%;background:currentColor;animation-timing-function:cubic-bezier(0,1,1,0)}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(1){left:8px;animation:lds-ellipsis1-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(2){left:8px;animation:lds-ellipsis2-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(3){left:32px;animation:lds-ellipsis2-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(4){left:56px;animation:lds-ellipsis3-edb749e2 .6s infinite}@keyframes lds-ellipsis1-edb749e2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3-edb749e2{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2-edb749e2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes captcha--refreshing-3b07deff{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.captcha--container[data-v-3b07deff]{position:relative;width:300px;height:400px;background:#fff;display:flex;flex-direction:column;overflow:hidden}.captcha--container.captcha--container--radius[data-v-3b07deff]{border-radius:6px}.captcha--container.captcha--container--shadow[data-v-3b07deff]{box-shadow:0 0 11px #999}.captcha--box[data-v-3b07deff]{position:relative;flex:1;overflow:hidden}.captcha--content[data-v-3b07deff]{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;box-sizing:border-box}.captcha--bottom[data-v-3b07deff]{display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:15px 10px}.captcha--bottom .captcha--svg-icon[data-v-3b07deff]{width:28px;height:28px;display:block;cursor:pointer;fill:#1c4c5b}.captcha--bottom .captcha--svg-icon+.captcha--svg-icon[data-v-3b07deff]{margin-left:12px}.captcha--bottom .captcha--btn-refresh.captcha--btn-refresh--active[data-v-3b07deff]{animation:captcha--refreshing-3b07deff linear .8s infinite}
.captcha--slider-bar[data-v-fcfe5ea2]{height:55px;position:relative;margin-top:15px}.captcha--slider-bar--bar[data-v-fcfe5ea2]{height:35px;position:relative;top:5px;background-color:#eee;border-radius:3px;overflow:hidden}.captcha--slider-bar--bar .captcha--slider-bar--active[data-v-fcfe5ea2]{position:absolute;left:0;top:0;height:100%;background-color:#6495ed}.captcha--slider-bar--track[data-v-fcfe5ea2]{background-color:#fff;position:absolute;left:0;top:0;width:55px;height:45px;border-radius:3px;box-shadow:0 0 5px #999;display:flex;justify-content:center;align-items:center}.captcha--slider-bar--track .captcha--slider-bar--track-icon[data-v-fcfe5ea2]{fill:#333;display:block;width:25px;height:25px}.captcha--status-tip[data-v-4b782e10]{position:absolute;left:0;bottom:0;width:100%;display:flex;justify-content:center;align-items:center;color:#fff;font-size:14px;height:30px}.captcha--status-tip .captcha--status-tip--icon[data-v-4b782e10]{fill:#fff;display:block;width:18px;height:18px;margin-right:5px}.captcha--status-tip.captcha--status-tip--success[data-v-4b782e10]{background-color:#39c522}.captcha--status-tip.captcha--status-tip--fail[data-v-4b782e10]{background-color:#ff5d39}.captcha--view[data-v-ef209593]{padding:15px 10px}.captcha--view--content[data-v-ef209593]{position:relative;height:210px;margin-top:15px;overflow:hidden}.captcha--view--tip[data-v-ef209593]{font-size:14px;color:#333;line-height:24px;text-align:center}.captcha--status-tip-enter-active[data-v-ef209593],.captcha--status-tip-appear-active[data-v-ef209593]{transition:transform ease-out .4s}.captcha--status-tip-enter-from[data-v-ef209593],.captcha--status-tip-appear-from[data-v-ef209593]{transform:translateY(100%)}.captcha--status-tip-enter-to[data-v-ef209593],.captcha--status-tip-appear-to[data-v-ef209593]{transform:translateY(0)}.captcha--view--concat--bg[data-v-fd603259]{position:absolute;display:block;width:100%;height:100%}.captcha--view--concat--track[data-v-fd603259]{position:absolute;display:block;left:0;top:0;width:100%;overflow:hidden;background-size:100% auto;background-position:0px 0px}.captcha--view--rotate--bg[data-v-76bb4af9]{position:absolute;display:block;width:100%;height:100%}.captcha--view--rotate--track[data-v-76bb4af9]{position:absolute;display:block;width:100%;height:100%;object-fit:contain}.captcha--view--slider--bg[data-v-8fb0f971]{position:absolute;display:block;width:100%;height:100%}.captcha--view--slider--track[data-v-8fb0f971]{position:absolute;display:block;width:auto;height:100%;left:0;top:0}.captcha--error[data-v-6ba70e16]{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:rgba(255,255,255,.7)}.captcha--error .captcha--error--icon[data-v-6ba70e16]{fill:#1c4c5b;width:80px;height:80px}.captcha--error .captcha--error--text[data-v-6ba70e16]{color:#1c4c5b;font-size:14px;margin-top:12px}.captcha--loading[data-v-edb749e2]{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background-color:rgba(255,255,255,.8)}.captcha--loading .lds-ellipsis[data-v-edb749e2],.captcha--loading .lds-ellipsis div[data-v-edb749e2]{box-sizing:border-box}.captcha--loading .lds-ellipsis[data-v-edb749e2]{color:#1c4c5b;display:inline-block;position:relative;width:80px;height:80px}.captcha--loading .lds-ellipsis div[data-v-edb749e2]{position:absolute;top:33.33333px;width:13.33333px;height:13.33333px;border-radius:50%;background:currentColor;animation-timing-function:cubic-bezier(0,1,1,0)}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(1){left:8px;animation:lds-ellipsis1-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(2){left:8px;animation:lds-ellipsis2-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(3){left:32px;animation:lds-ellipsis2-edb749e2 .6s infinite}.captcha--loading .lds-ellipsis div[data-v-edb749e2]:nth-child(4){left:56px;animation:lds-ellipsis3-edb749e2 .6s infinite}@keyframes lds-ellipsis1-edb749e2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3-edb749e2{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2-edb749e2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes captcha--refreshing-0a2d342a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.captcha--container[data-v-0a2d342a]{position:relative;width:300px;height:400px;background:#fff;display:flex;flex-direction:column;overflow:hidden}.captcha--container.captcha--container--radius[data-v-0a2d342a]{border-radius:6px}.captcha--container.captcha--container--shadow[data-v-0a2d342a]{box-shadow:0 0 11px #999}.captcha--box[data-v-0a2d342a]{position:relative;flex:1;overflow:hidden}.captcha--content[data-v-0a2d342a]{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;box-sizing:border-box}.captcha--bottom[data-v-0a2d342a]{display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:15px 10px}.captcha--bottom .captcha--svg-icon[data-v-0a2d342a]{width:28px;height:28px;display:block;cursor:pointer;fill:#1c4c5b}.captcha--bottom .captcha--svg-icon+.captcha--svg-icon[data-v-0a2d342a]{margin-left:12px}.captcha--bottom .captcha--btn-refresh.captcha--btn-refresh--active[data-v-0a2d342a]{animation:captcha--refreshing-0a2d342a linear .8s infinite}
import { PropType } from 'vue';
declare const _default: import("vue").DefineComponent<{
requestCaptchaDataUrl: {
type: StringConstructor;
required: true;
};
validCaptchaUrl: {
type: StringConstructor;
required: true;
};
showClose: {
type: BooleanConstructor;
default: boolean;
};
radius: {
type: NumberConstructor;
};
shadow: {
type: BooleanConstructor;
default: boolean;
};
locale: {
type: StringConstructor;
};
extra: {
type: PropType<Record<string, any>>;
default: () => {};
};
}, {
containerRef: import("vue").Ref<HTMLDivElement | undefined>;
refresh: () => void;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
close: () => void;
success: (id: string) => void;
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
requestCaptchaDataUrl: {
type: StringConstructor;
required: true;
};
validCaptchaUrl: {
type: StringConstructor;
required: true;
};
showClose: {
type: BooleanConstructor;
default: boolean;
};
radius: {
type: NumberConstructor;
};
shadow: {
type: BooleanConstructor;
default: boolean;
};
locale: {
type: StringConstructor;
};
extra: {
type: PropType<Record<string, any>>;
default: () => {};
};
}>> & {
onSuccess?: ((id: string) => any) | undefined;
onClose?: (() => any) | undefined;
}, {
showClose: boolean;
shadow: boolean;
extra: Record<string, any>;
}, {}>;
export default _default;
import { PropType } from 'vue';
import { CaptchaDisplayData } from '../core';
import { VerifyStatus } from '../types';
declare const _default: import("vue").DefineComponent<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
verify: (data: object) => void;
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}>> & {
onVerify?: ((data: object) => any) | undefined;
}, {}, {}>;
export default _default;
import { PropType } from 'vue';
import { CaptchaDisplayData } from '../core';
import { VerifyStatus } from '../types';
declare const _default: import("vue").DefineComponent<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
verify: (data: object) => void;
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}>> & {
onVerify?: ((data: object) => any) | undefined;
}, {}, {}>;
export default _default;
import { PropType } from 'vue';
import { CaptchaDisplayData } from '../core';
import { VerifyStatus } from '../types';
declare const _default: import("vue").DefineComponent<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
verify: (data: object) => void;
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
captcha: {
type: PropType<CaptchaDisplayData>;
required: true;
};
verifyStatus: {
type: PropType<VerifyStatus>;
};
}>> & {
onVerify?: ((data: object) => any) | undefined;
}, {}, {}>;
export default _default;
import { PropType } from 'vue';
import { VerifyStatus } from '../types';
declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
verifyStatus: {
type: PropType<VerifyStatus>;
};
x: {
type: NumberConstructor;
default: number;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
verifyStatus: {
type: PropType<VerifyStatus>;
};
x: {
type: NumberConstructor;
default: number;
};
}>>, {
x: number;
}, {}>, {
default?(_: {}): any;
}>;
export default _default;
type __VLS_WithTemplateSlots<T, S> = T & {
new (): {
$slots: S;
};
};
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
click: (event: MouseEvent) => void;
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>> & {
onClick?: ((event: MouseEvent) => any) | undefined;
}, {}, {}>;
export default _default;
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
export default _default;
declare const _default: import("vue").DefineComponent<{
x: {
type: NumberConstructor;
default: number;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
x: {
type: NumberConstructor;
default: number;
};
}>>, {
x: number;
}, {}>;
export default _default;
declare const _default: import("vue").DefineComponent<{
status: {
type: BooleanConstructor;
required: true;
};
message: {
type: StringConstructor;
};
}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
status: {
type: BooleanConstructor;
required: true;
};
message: {
type: StringConstructor;
};
}>>, {}, {}>;
export default _default;
import { CaptchaDisplayData } from './types';
/**
* 创建验证码实例的配置项
*/
interface CreateCaptchaOptions {
/**
* 自动绑定开始拖动事件的元素
*/
triggers?: HTMLElement[];
/**
* 验证码显示数据
*/
captcha: CaptchaDisplayData;
/**
* 允许拖动的最大距离
*/
max: number;
/**
* 当进行拖动时触发的回调
* @param x 拖动的距离
*/
onDrag: (x: number) => void;
/**
* 当拖动完成需要校验数据时触发的回调
* @param data 待校验的数据
* @returns
*/
onVerify: (data: object) => void;
}
/**
* 验证码实例
*/
export interface CaptchaInstance {
/**
* 当开始拖动时调用的方法
* @param event
* @returns
*/
onDragStart: (event: MouseEvent | TouchEvent) => void;
/**
* 销毁验证码实例,解除所有的事件绑定
*/
destroy(): void;
}
/**
* 创建拖动填充型验证码的配置项
*/
export interface CreateSliderCaptchaOptions extends Omit<CreateCaptchaOptions, 'max'> {
/**
* 实际显示尺寸与原始图片的比例
*/
ratio: number;
}
/**
* 创建拖动填充型验证码实例
* @param options
*/
export declare function createSliderCaptcha(options: CreateSliderCaptchaOptions): CaptchaInstance;
/**
* 创建旋转型验证码的配置项
*/
export interface CreateRotateCaptchaOptions extends Omit<CreateCaptchaOptions, 'onDrag'> {
/**
* 实际显示尺寸与原始图片的比例
*/
ratio: number;
/**
* 当进行拖动时触发的回调
* @param x 拖动的距离
* @param deg 旋转的角度
*/
onDrag: (x: number, deg: number) => void;
}
/**
* 创建旋转型验证码实例
*/
export declare function createRotateCaptcha(options: CreateRotateCaptchaOptions): CaptchaInstance;
/**
* 创建上下拼接型验证码的配置项
*/
export interface CreateConcatCaptchaOptions extends CreateCaptchaOptions {
/**
* 实际显示尺寸与原始图片的比例
*/
ratio: number;
}
/**
* 获取上下拼接型验证码的滑块高度
*/
export declare function getConcatTrackHeight(captcha: CaptchaDisplayData, ratio: number): number;
/**
* 创建上下拼接型验证码实例
*/
export declare function createConcatCaptcha(options: CreateConcatCaptchaOptions): CaptchaInstance;
export {};
import { ApiResp, CaptchaData } from './types';
/**
* HTTP请求配置项
*/
export interface HttpRequestOptions {
/**
* 请求地址
*/
url: string;
/**
* 基地址
*/
baseURL?: string;
/**
* 请求方法
*/
method?: string;
/**
* 请求参数
*/
params?: Record<string, string>;
/**
* 请求头
*/
headers?: Record<string, string>;
/**
* 请求体
*/
data?: any;
/**
* 请求超时时间
*/
timeout?: number;
/**
* 跨域时是否包含身份信息
*/
withCredentials?: boolean;
}
export interface HttpResponse<T = any> {
/**
* 响应码
*/
status: number;
/**
* 响应头
*/
headers: Record<string, string>;
/**
* 响应体
*/
data: T;
}
/**
* 加载验证码数据
* @param options 获取验证码数据的配置项
*/
export declare function loadCaptcha(options: HttpRequestOptions): Promise<ApiResp<CaptchaData>>;
export interface ValidCaptchaOptions extends Omit<HttpRequestOptions, 'method' | 'data'> {
data: {
key: string;
data: any;
};
}
/**
* 校验验证码数据,校验成功返回undefined,校验失败返回失败文字
* @param options
*/
export declare function validCaptcha(options: ValidCaptchaOptions): Promise<string | void>;
export * from './locales';
export * from './http';
export * from './types';
export * from './captcha';
/**
* 根据输入值,返回可用的语言
* @param language
*/
export declare function getLanguage(language?: string): string;
/**
* 获取翻译字典
* @param language
*/
export declare function getTranslations(language?: string): Record<string, string>;
/**
* 获取翻译函数
* @param language
*/
export declare function getTranslator(language?: string): (id: string) => string;
/**
* 验证码类型
*/
export type CaptchaType = 'SLIDER' | 'ROTATE' | 'CONCAT';
/**
* 接口响应数据格式
*/
export interface ApiResp<T = any> {
code: number;
msg: string;
data: T;
}
/**
* 验证码显示数据
*/
export interface CaptchaDisplayData {
/**
* 验证码类型
*/
type: CaptchaType;
templateImage: string;
templateImageHeight: number;
templateImageTag: string;
templateImageWidth: number;
backgroundImage: string;
backgroundImageHeight: number;
backgroundImageTag: string;
backgroundImageWidth: number;
data: {
randomY: number;
};
}
/**
* 验证码数据
*/
export interface CaptchaData {
key: string;
captcha: CaptchaDisplayData;
}
export { default as Captcha } from './Captcha.vue';
import { Ref } from 'vue';
export declare function provideLocale(ref: Ref<string | undefined>): void;
export declare function useTranslator(locale?: Ref<string | undefined>): import("vue").ComputedRef<(id: string) => string>;
import { CaptchaData } from './core';
/**
* 验证码的校验状态
*/
export interface VerifyStatus {
/**
* 是否校验成功
*/
status: boolean;
/**
* 失败的消息
*/
message?: string;
}
/**
* 包含校验状态数据的验证码数据
*/
export interface CurrentCaptchaData extends CaptchaData {
/**
* 校验状态
*/
verifyStatus?: VerifyStatus;
}
{
"name": "fj-captcha-vue",
"version": "1.0.0",
"version": "1.0.1",
"type": "module",
"main": "./esm/index.js",
"typings": "./esm/index.d.ts",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment