@yuno-payments/sdk-web 0.0.1-beta.0
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/README.md +20 -0
- package/dist/bundle.cjs.js +68 -0
- package/dist/bundle.cjs.js.map +1 -0
- package/dist/bundle.esm.js +66 -0
- package/dist/bundle.esm.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/types/__tests__/load-script.spec.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/load-script.d.ts +2 -0
- package/dist/types/types.d.ts +5 -0
- package/dist/types/utils/__tests__/get-url.spec.d.ts +1 -0
- package/dist/types/utils/__tests__/inject-script.spec.d.ts +1 -0
- package/dist/types/utils/__tests__/sleep.spec.d.ts +1 -0
- package/dist/types/utils/get-url.d.ts +1 -0
- package/dist/types/utils/inject-script.d.ts +5 -0
- package/dist/types/utils/sleep.d.ts +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SDK Web VTEX
|
|
2
|
+
|
|
3
|
+
This is to use Yuno SDK
|
|
4
|
+
|
|
5
|
+
Install it
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
npm install @yuno-payments/sdk-web
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use it
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
import { loadScript } from '@yuno-payments/sdk-web'
|
|
15
|
+
...
|
|
16
|
+
const yuno = await loadScript()
|
|
17
|
+
|
|
18
|
+
yuno.initialize('publickAPikey')
|
|
19
|
+
|
|
20
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const EnvToEnvironmentSuffix = {
|
|
4
|
+
dev: '.dev',
|
|
5
|
+
staging: '.staging',
|
|
6
|
+
sandbox: '.sandbox',
|
|
7
|
+
prod: '',
|
|
8
|
+
};
|
|
9
|
+
const BASE_URL = 'https://sdk-web__ENV__.y.uno/v1.1/main.js';
|
|
10
|
+
const getUrl = (env = 'prod') => {
|
|
11
|
+
const environmentSuffix = EnvToEnvironmentSuffix[env];
|
|
12
|
+
return environmentSuffix ? BASE_URL.replace('__ENV__', environmentSuffix) : BASE_URL.replace('__ENV__', '');
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const sleep = (time) => {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
setTimeout(resolve, time);
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const SCRIPT_ID = 'yuno-script';
|
|
22
|
+
const TRY = 5;
|
|
23
|
+
const injectScript = async ({ url }) => {
|
|
24
|
+
if (document.getElementById(SCRIPT_ID)) {
|
|
25
|
+
if (window.Yuno) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
await onLoading();
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const head = document.getElementsByTagName('head')[0];
|
|
34
|
+
const js = document.createElement('script');
|
|
35
|
+
js.id = SCRIPT_ID;
|
|
36
|
+
js.src = url;
|
|
37
|
+
js.async = true;
|
|
38
|
+
js.defer = true;
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
window.addEventListener('yuno-sdk-ready', () => {
|
|
41
|
+
resolve(true);
|
|
42
|
+
});
|
|
43
|
+
js.onerror = (error) => {
|
|
44
|
+
reject(new Error(`Failed to load script: ${url} - ${error}`));
|
|
45
|
+
};
|
|
46
|
+
head.appendChild(js);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
const onLoading = async () => {
|
|
50
|
+
let count = 0;
|
|
51
|
+
while (count < TRY) {
|
|
52
|
+
if (window.Yuno) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
count++;
|
|
56
|
+
await sleep(250);
|
|
57
|
+
}
|
|
58
|
+
throw new Error('Yuno SDK not found');
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const loadScript = async (props) => {
|
|
62
|
+
const url = getUrl(props?.env);
|
|
63
|
+
await injectScript({ url });
|
|
64
|
+
return window.Yuno;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
exports.loadScript = loadScript;
|
|
68
|
+
//# sourceMappingURL=bundle.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.cjs.js","sources":["../src/utils/get-url.ts","../src/utils/sleep.ts","../src/utils/inject-script.ts","../src/load-script.ts"],"sourcesContent":["const EnvToEnvironmentSuffix: { [key: string]: string } = {\n dev: '.dev',\n staging: '.staging',\n sandbox: '.sandbox',\n prod: '',\n}\n\nconst BASE_URL = 'https://sdk-web__ENV__.y.uno/v1.1/main.js'\n\nexport const getUrl = (env: 'dev' | 'staging' | 'sandbox' | 'prod' = 'prod') => {\n const environmentSuffix = EnvToEnvironmentSuffix[env]\n\n return environmentSuffix ? BASE_URL.replace('__ENV__', environmentSuffix) : BASE_URL.replace('__ENV__', '')\n}","export const sleep = (time: number) => {\n return new Promise((resolve) => {\n setTimeout(resolve, time)\n })\n}\n","import { sleep } from \"./sleep\"\n\ninterface InjectScriptProps {\n url: string\n}\n\nconst SCRIPT_ID = 'yuno-script'\nconst TRY = 5\n\nexport const injectScript = async ({ url }: InjectScriptProps): Promise<boolean> => {\n if (document.getElementById(SCRIPT_ID)) {\n if (window.Yuno) {\n return true\n } else {\n await onLoading()\n return true\n }\n }\n\n const head = document.getElementsByTagName('head')[0]\n const js = document.createElement('script')\n js.id = SCRIPT_ID\n js.src = url\n js.async = true\n js.defer = true\n\n return new Promise((resolve, reject) => {\n window.addEventListener('yuno-sdk-ready', () => {\n resolve(true)\n })\n\n js.onerror = (error) => {\n reject(new Error(`Failed to load script: ${url} - ${error}`));\n }\n\n head.appendChild(js)\n })\n}\n\nconst onLoading = async (): Promise<void> => {\n let count = 0\n\n while (count < TRY) {\n if (window.Yuno) {\n return\n }\n\n count++\n await sleep(250)\n }\n\n throw new Error('Yuno SDK not found')\n}\n","import { LoadScript } from \"./types\";\nimport { getUrl } from \"./utils/get-url\";\nimport { injectScript } from \"./utils/inject-script\";\n\nexport const loadScript: LoadScript = async (props) => {\n const url = getUrl(props?.env)\n await injectScript({ url })\n\n return window.Yuno\n}\n\n"],"names":[],"mappings":";;AAAA,MAAM,sBAAsB,GAA8B;AACtD,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,IAAI,EAAE,EAAE;CACX;AAED,MAAM,QAAQ,GAAG,2CAA2C;AAErD,MAAM,MAAM,GAAG,CAAC,GAA8C,GAAA,MAAM,KAAI;AAC3E,IAAA,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,GAAG,CAAC;IAErD,OAAO,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AAC/G,CAAC;;ACbM,MAAM,KAAK,GAAG,CAAC,IAAY,KAAI;AAClC,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,QAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;AAC7B,KAAC,CAAC;AACN,CAAC;;ACED,MAAM,SAAS,GAAG,aAAa;AAC/B,MAAM,GAAG,GAAG,CAAC;AAEN,MAAM,YAAY,GAAG,OAAO,EAAE,GAAG,EAAqB,KAAsB;AACjF,IAAA,IAAI,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;AACtC,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,IAAI;;aACN;YACL,MAAM,SAAS,EAAE;AACjB,YAAA,OAAO,IAAI;;;IAIf,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC3C,IAAA,EAAE,CAAC,EAAE,GAAG,SAAS;AACjB,IAAA,EAAE,CAAC,GAAG,GAAG,GAAG;AACZ,IAAA,EAAE,CAAC,KAAK,GAAG,IAAI;AACf,IAAA,EAAE,CAAC,KAAK,GAAG,IAAI;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAK;YAC7C,OAAO,CAAC,IAAI,CAAC;AACf,SAAC,CAAC;AAEF,QAAA,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAC,CAAC;AAC/D,SAAC;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACtB,KAAC,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,YAA0B;IAC1C,IAAI,KAAK,GAAG,CAAC;AAEb,IAAA,OAAO,KAAK,GAAG,GAAG,EAAE;AAClB,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;YACf;;AAGF,QAAA,KAAK,EAAE;AACP,QAAA,MAAM,KAAK,CAAC,GAAG,CAAC;;AAGlB,IAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACvC,CAAC;;MChDY,UAAU,GAAe,OAAO,KAAK,KAAI;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;AAC9B,IAAA,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAE3B,OAAO,MAAM,CAAC,IAAI;AACtB;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const EnvToEnvironmentSuffix = {
|
|
2
|
+
dev: '.dev',
|
|
3
|
+
staging: '.staging',
|
|
4
|
+
sandbox: '.sandbox',
|
|
5
|
+
prod: '',
|
|
6
|
+
};
|
|
7
|
+
const BASE_URL = 'https://sdk-web__ENV__.y.uno/v1.1/main.js';
|
|
8
|
+
const getUrl = (env = 'prod') => {
|
|
9
|
+
const environmentSuffix = EnvToEnvironmentSuffix[env];
|
|
10
|
+
return environmentSuffix ? BASE_URL.replace('__ENV__', environmentSuffix) : BASE_URL.replace('__ENV__', '');
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const sleep = (time) => {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
setTimeout(resolve, time);
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const SCRIPT_ID = 'yuno-script';
|
|
20
|
+
const TRY = 5;
|
|
21
|
+
const injectScript = async ({ url }) => {
|
|
22
|
+
if (document.getElementById(SCRIPT_ID)) {
|
|
23
|
+
if (window.Yuno) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
await onLoading();
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const head = document.getElementsByTagName('head')[0];
|
|
32
|
+
const js = document.createElement('script');
|
|
33
|
+
js.id = SCRIPT_ID;
|
|
34
|
+
js.src = url;
|
|
35
|
+
js.async = true;
|
|
36
|
+
js.defer = true;
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
window.addEventListener('yuno-sdk-ready', () => {
|
|
39
|
+
resolve(true);
|
|
40
|
+
});
|
|
41
|
+
js.onerror = (error) => {
|
|
42
|
+
reject(new Error(`Failed to load script: ${url} - ${error}`));
|
|
43
|
+
};
|
|
44
|
+
head.appendChild(js);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const onLoading = async () => {
|
|
48
|
+
let count = 0;
|
|
49
|
+
while (count < TRY) {
|
|
50
|
+
if (window.Yuno) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
count++;
|
|
54
|
+
await sleep(250);
|
|
55
|
+
}
|
|
56
|
+
throw new Error('Yuno SDK not found');
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const loadScript = async (props) => {
|
|
60
|
+
const url = getUrl(props?.env);
|
|
61
|
+
await injectScript({ url });
|
|
62
|
+
return window.Yuno;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { loadScript };
|
|
66
|
+
//# sourceMappingURL=bundle.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.esm.js","sources":["../src/utils/get-url.ts","../src/utils/sleep.ts","../src/utils/inject-script.ts","../src/load-script.ts"],"sourcesContent":["const EnvToEnvironmentSuffix: { [key: string]: string } = {\n dev: '.dev',\n staging: '.staging',\n sandbox: '.sandbox',\n prod: '',\n}\n\nconst BASE_URL = 'https://sdk-web__ENV__.y.uno/v1.1/main.js'\n\nexport const getUrl = (env: 'dev' | 'staging' | 'sandbox' | 'prod' = 'prod') => {\n const environmentSuffix = EnvToEnvironmentSuffix[env]\n\n return environmentSuffix ? BASE_URL.replace('__ENV__', environmentSuffix) : BASE_URL.replace('__ENV__', '')\n}","export const sleep = (time: number) => {\n return new Promise((resolve) => {\n setTimeout(resolve, time)\n })\n}\n","import { sleep } from \"./sleep\"\n\ninterface InjectScriptProps {\n url: string\n}\n\nconst SCRIPT_ID = 'yuno-script'\nconst TRY = 5\n\nexport const injectScript = async ({ url }: InjectScriptProps): Promise<boolean> => {\n if (document.getElementById(SCRIPT_ID)) {\n if (window.Yuno) {\n return true\n } else {\n await onLoading()\n return true\n }\n }\n\n const head = document.getElementsByTagName('head')[0]\n const js = document.createElement('script')\n js.id = SCRIPT_ID\n js.src = url\n js.async = true\n js.defer = true\n\n return new Promise((resolve, reject) => {\n window.addEventListener('yuno-sdk-ready', () => {\n resolve(true)\n })\n\n js.onerror = (error) => {\n reject(new Error(`Failed to load script: ${url} - ${error}`));\n }\n\n head.appendChild(js)\n })\n}\n\nconst onLoading = async (): Promise<void> => {\n let count = 0\n\n while (count < TRY) {\n if (window.Yuno) {\n return\n }\n\n count++\n await sleep(250)\n }\n\n throw new Error('Yuno SDK not found')\n}\n","import { LoadScript } from \"./types\";\nimport { getUrl } from \"./utils/get-url\";\nimport { injectScript } from \"./utils/inject-script\";\n\nexport const loadScript: LoadScript = async (props) => {\n const url = getUrl(props?.env)\n await injectScript({ url })\n\n return window.Yuno\n}\n\n"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAA8B;AACtD,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,IAAI,EAAE,EAAE;CACX;AAED,MAAM,QAAQ,GAAG,2CAA2C;AAErD,MAAM,MAAM,GAAG,CAAC,GAA8C,GAAA,MAAM,KAAI;AAC3E,IAAA,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,GAAG,CAAC;IAErD,OAAO,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AAC/G,CAAC;;ACbM,MAAM,KAAK,GAAG,CAAC,IAAY,KAAI;AAClC,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,QAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;AAC7B,KAAC,CAAC;AACN,CAAC;;ACED,MAAM,SAAS,GAAG,aAAa;AAC/B,MAAM,GAAG,GAAG,CAAC;AAEN,MAAM,YAAY,GAAG,OAAO,EAAE,GAAG,EAAqB,KAAsB;AACjF,IAAA,IAAI,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;AACtC,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,IAAI;;aACN;YACL,MAAM,SAAS,EAAE;AACjB,YAAA,OAAO,IAAI;;;IAIf,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC3C,IAAA,EAAE,CAAC,EAAE,GAAG,SAAS;AACjB,IAAA,EAAE,CAAC,GAAG,GAAG,GAAG;AACZ,IAAA,EAAE,CAAC,KAAK,GAAG,IAAI;AACf,IAAA,EAAE,CAAC,KAAK,GAAG,IAAI;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAK;YAC7C,OAAO,CAAC,IAAI,CAAC;AACf,SAAC,CAAC;AAEF,QAAA,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAC,CAAC;AAC/D,SAAC;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACtB,KAAC,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,YAA0B;IAC1C,IAAI,KAAK,GAAG,CAAC;AAEb,IAAA,OAAO,KAAK,GAAG,GAAG,EAAE;AAClB,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;YACf;;AAGF,QAAA,KAAK,EAAE;AACP,QAAA,MAAM,KAAK,CAAC,GAAG,CAAC;;AAGlB,IAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;AACvC,CAAC;;MChDY,UAAU,GAAe,OAAO,KAAK,KAAI;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;AAC9B,IAAA,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAE3B,OAAO,MAAM,CAAC,IAAI;AACtB;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getUrl: (env?: "dev" | "staging" | "sandbox" | "prod") => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const sleep: (time: number) => Promise<unknown>;
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yuno-payments/sdk-web",
|
|
3
|
+
"version": "0.0.1-beta.0",
|
|
4
|
+
"description": "Wrapper to install sdk-web and types",
|
|
5
|
+
"main": "dist/bundle.cjs.js",
|
|
6
|
+
"module": "dist/bundle.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "rollup -c",
|
|
13
|
+
"dev": "rollup -c -w",
|
|
14
|
+
"test": "vitest",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"author": "Camilo Segura",
|
|
18
|
+
"license": "ISC",
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
21
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
22
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
23
|
+
"@rollup/plugin-typescript": "^12.1.2",
|
|
24
|
+
"@yuno-payments/sdk-web-types": "^1.23.0",
|
|
25
|
+
"jsdom": "^26.0.0",
|
|
26
|
+
"rollup": "^4.34.6",
|
|
27
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
28
|
+
"tslib": "^2.8.1",
|
|
29
|
+
"typescript": "^5.7.3",
|
|
30
|
+
"vitest": "^3.0.5"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|