@capillarytech/creatives-library 7.14.7 → 7.14.8
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/assets/pdfIcon.svg +9 -0
- package/config/app.js +1 -0
- package/package.json +1 -1
- package/v2Components/CapDocumentUpload/index.js +211 -0
- package/v2Components/CapDocumentUpload/index.scss +63 -0
- package/v2Components/CapDocumentUpload/messages.js +38 -0
- package/v2Components/CapVideoUpload/constants.js +1 -0
- package/v2Components/CapVideoUpload/index.js +68 -38
- package/v2Components/CapVideoUpload/index.scss +10 -0
- package/v2Components/CapVideoUpload/messages.js +11 -3
- package/v2Components/TemplatePreview/_templatePreview.scss +6 -0
- package/v2Components/TemplatePreview/index.js +12 -0
- package/v2Containers/Facebook/Advertisement/index.js +1 -1
- package/v2Containers/Templates/_templates.scss +16 -0
- package/v2Containers/Templates/index.js +2 -1
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +9 -0
- package/v2Containers/Whatsapp/constants.js +5 -0
- package/v2Containers/Whatsapp/index.js +127 -6
- package/v2Containers/Whatsapp/index.scss +17 -0
- package/v2Containers/Whatsapp/styles.scss +38 -0
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +64 -140
- package/v2Containers/Whatsapp/utils.js +47 -1
|
@@ -593,6 +593,22 @@
|
|
|
593
593
|
max-height: 123px;
|
|
594
594
|
margin-bottom: 4px;
|
|
595
595
|
}
|
|
596
|
+
.whatsapp-doc {
|
|
597
|
+
width: 100%;
|
|
598
|
+
max-height: 123px;
|
|
599
|
+
margin-bottom: 4px;
|
|
600
|
+
.pdf-img-box {
|
|
601
|
+
width: 100%;
|
|
602
|
+
margin: auto;
|
|
603
|
+
.pdf-preview-img {
|
|
604
|
+
width: 100%;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
.pdf-label{
|
|
608
|
+
width: 100%;
|
|
609
|
+
margin: auto;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
596
612
|
.whatsapp-rcs-template-name {
|
|
597
613
|
max-width: 170px;
|
|
598
614
|
overflow: hidden;
|
|
@@ -1067,7 +1067,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1067
1067
|
break;
|
|
1068
1068
|
}
|
|
1069
1069
|
case WHATSAPP: {
|
|
1070
|
-
const { whatsappImageSrc = '', templateMsg} = getWhatsappContent(template);
|
|
1070
|
+
const { whatsappImageSrc = '', templateMsg, docPreview} = getWhatsappContent(template);
|
|
1071
1071
|
templateData.title = (
|
|
1072
1072
|
<CapRow>
|
|
1073
1073
|
<CapLabel className="whatsapp-rcs-template-name">{template?.name}</CapLabel>
|
|
@@ -1079,6 +1079,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1079
1079
|
{whatsappImageSrc && (
|
|
1080
1080
|
<CapImage src={whatsappImageSrc} className="whatsapp-image" />
|
|
1081
1081
|
)}
|
|
1082
|
+
<div className="whatsapp-doc">{docPreview}</div>
|
|
1082
1083
|
<span
|
|
1083
1084
|
className={`${
|
|
1084
1085
|
whatsappImageSrc
|
|
@@ -786,6 +786,9 @@ exports[`Test Templates container Test max templates exceeded 1`] = `
|
|
|
786
786
|
className="whatsapp-image"
|
|
787
787
|
src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
|
|
788
788
|
/>
|
|
789
|
+
<div
|
|
790
|
+
className="whatsapp-doc"
|
|
791
|
+
/>
|
|
789
792
|
<span
|
|
790
793
|
className="whatsapp-message-with-image"
|
|
791
794
|
>
|
|
@@ -1220,6 +1223,9 @@ exports[`Test Templates container Test max templates not exceeded 1`] = `
|
|
|
1220
1223
|
className="whatsapp-image"
|
|
1221
1224
|
src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
|
|
1222
1225
|
/>
|
|
1226
|
+
<div
|
|
1227
|
+
className="whatsapp-doc"
|
|
1228
|
+
/>
|
|
1223
1229
|
<span
|
|
1224
1230
|
className="whatsapp-message-with-image"
|
|
1225
1231
|
>
|
|
@@ -1654,6 +1660,9 @@ exports[`Test Templates container Test max templates warning 1`] = `
|
|
|
1654
1660
|
className="whatsapp-image"
|
|
1655
1661
|
src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
|
|
1656
1662
|
/>
|
|
1663
|
+
<div
|
|
1664
|
+
className="whatsapp-doc"
|
|
1665
|
+
/>
|
|
1657
1666
|
<span
|
|
1658
1667
|
className="whatsapp-message-with-image"
|
|
1659
1668
|
>
|
|
@@ -179,9 +179,14 @@ export const INITIAL_CTA_DATA = [
|
|
|
179
179
|
];
|
|
180
180
|
|
|
181
181
|
export const ALLOWED_IMAGE_EXTENSIONS_REGEX = /\.(jpe?g|png)$/i;
|
|
182
|
+
export const ALLOWED_EXTENSIONS_VIDEO_REGEX = (/\.(mp4|3gpp)$/i);
|
|
183
|
+
export const ALLOWED_EXTENSIONS_DOCUMENT_REGEX = (/\.(pdf)$/i);
|
|
182
184
|
export const WHATSAPP_IMG_SIZE = 5000000; // 5MB
|
|
185
|
+
export const WHATSAPP_VIDEO_SIZE = 16000000; // 16MB
|
|
186
|
+
export const WHATSAPP_DOCUMENT_SIZE = 16000000; // 16MB
|
|
183
187
|
export const HOST_TWILIO = 'twiliowhatsapptrans';
|
|
184
188
|
export const HOST_KARIX = 'karixwhatsappbulk';
|
|
189
|
+
export const SIZE_UNITS = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
185
190
|
|
|
186
191
|
export const LANGUAGE_OPTIONS = [
|
|
187
192
|
{
|
|
@@ -59,6 +59,10 @@ import {
|
|
|
59
59
|
ALLOWED_IMAGE_EXTENSIONS_REGEX,
|
|
60
60
|
WHATSAPP_IMG_SIZE,
|
|
61
61
|
HOST_KARIX,
|
|
62
|
+
ALLOWED_EXTENSIONS_VIDEO_REGEX,
|
|
63
|
+
ALLOWED_EXTENSIONS_DOCUMENT_REGEX,
|
|
64
|
+
WHATSAPP_DOCUMENT_SIZE,
|
|
65
|
+
WHATSAPP_VIDEO_SIZE,
|
|
62
66
|
} from './constants';
|
|
63
67
|
import { DATE_DISPLAY_FORMAT, TIME_DISPLAY_FORMAT } from '../App/constants';
|
|
64
68
|
import messages from './messages';
|
|
@@ -75,6 +79,9 @@ import {
|
|
|
75
79
|
WEBSITE,
|
|
76
80
|
} from '../../v2Components/CapWhatsappCTA/constants';
|
|
77
81
|
import { getCdnUrl } from '../../utils/cdnTransformation';
|
|
82
|
+
import CapVideoUpload from '../../v2Components/CapVideoUpload';
|
|
83
|
+
import CapDocumentUpload from '../../v2Components/CapDocumentUpload';
|
|
84
|
+
import { getWhatsappDocPreview } from './utils';
|
|
78
85
|
|
|
79
86
|
let varMap = {};
|
|
80
87
|
let editContent = {};
|
|
@@ -124,7 +131,12 @@ export const Whatsapp = (props) => {
|
|
|
124
131
|
const [spin, setSpin] = useState(false);
|
|
125
132
|
const [unsubscribeRequired, setUnsubscribeRequired] = useState(false);
|
|
126
133
|
const [whatsappImageSrc, setWhatsappImageSrc] = useState('');
|
|
134
|
+
const [whatsappVideoSrc, setWhatsappVideoSrc] = useState('');
|
|
135
|
+
const [whatsappVideoPreviewImg, setWhatsappVideoPreviewImg] = useState('');
|
|
136
|
+
const [whatsappDocSource, setWhatsappDocSource] = useState('');
|
|
137
|
+
const [whatsappDocParams, setWhatsappDocParams] = useState({});
|
|
127
138
|
const [karixFileHandle, setKarixFileHandle] = useState('');
|
|
139
|
+
const [assetList, updateAssetList] = useState([]);
|
|
128
140
|
//for edit only
|
|
129
141
|
const [isEditFlow, setEditFlow] = useState(false);
|
|
130
142
|
const [templateDate, setTemplateDate] = useState('');
|
|
@@ -144,6 +156,8 @@ export const Whatsapp = (props) => {
|
|
|
144
156
|
|
|
145
157
|
const isBtnTypeCta = buttonType === WHATSAPP_BUTTON_TYPES.CTA;
|
|
146
158
|
const isMediaTypeImage = templateMediaType === WHATSAPP_MEDIA_TYPES.IMAGE;
|
|
159
|
+
const isMediaTypeVideo = templateMediaType === WHATSAPP_MEDIA_TYPES.VIDEO;
|
|
160
|
+
const isMediaTypeDoc = templateMediaType === WHATSAPP_MEDIA_TYPES.DOCUMENT;
|
|
147
161
|
const WhatsappFooter = styled.div`
|
|
148
162
|
background-color: ${CAP_WHITE};
|
|
149
163
|
position: fixed;
|
|
@@ -211,9 +225,13 @@ export const Whatsapp = (props) => {
|
|
|
211
225
|
languages = [],
|
|
212
226
|
mediaType = WHATSAPP_MEDIA_TYPES.TEXT,
|
|
213
227
|
imageUrl = '',
|
|
228
|
+
videoUrl = '',
|
|
229
|
+
documentUrl = '',
|
|
214
230
|
karixFileHandle = '',
|
|
215
231
|
buttonType: btnType = WHATSAPP_BUTTON_TYPES.NONE,
|
|
216
232
|
buttons = [],
|
|
233
|
+
videoPreviewImg = '',
|
|
234
|
+
whatsappDocParams = {},
|
|
217
235
|
} = editContent;
|
|
218
236
|
setTemplateCategory(category);
|
|
219
237
|
setTemplateStatus(status);
|
|
@@ -221,6 +239,16 @@ export const Whatsapp = (props) => {
|
|
|
221
239
|
setTemplateLanguage(languages[0]?.language);
|
|
222
240
|
setTemplateMediaType(mediaType);
|
|
223
241
|
setWhatsappImageSrc(imageUrl);
|
|
242
|
+
setWhatsappVideoSrc(videoUrl);
|
|
243
|
+
setWhatsappDocSource(documentUrl);
|
|
244
|
+
setWhatsappDocParams(whatsappDocParams);
|
|
245
|
+
updateAssetList({
|
|
246
|
+
...assetList,
|
|
247
|
+
previewUrl: videoPreviewImg,
|
|
248
|
+
videoSrc: videoUrl,
|
|
249
|
+
fileHandle: karixFileHandle,
|
|
250
|
+
});
|
|
251
|
+
setWhatsappVideoPreviewImg(videoPreviewImg);
|
|
224
252
|
setKarixFileHandle(karixFileHandle);
|
|
225
253
|
setButtonType(btnType);
|
|
226
254
|
if (btnType === WHATSAPP_BUTTON_TYPES.CTA && buttons.length > 0) {
|
|
@@ -463,20 +491,30 @@ export const Whatsapp = (props) => {
|
|
|
463
491
|
{
|
|
464
492
|
value: WHATSAPP_MEDIA_TYPES.VIDEO,
|
|
465
493
|
label: (
|
|
466
|
-
<CapTooltip
|
|
494
|
+
<CapTooltip
|
|
495
|
+
title={
|
|
496
|
+
host !== HOST_KARIX
|
|
497
|
+
? formatMessage(messages.disabledFeatureTooltip)
|
|
498
|
+
: ''
|
|
499
|
+
}>
|
|
467
500
|
{formatMessage(messages.mediaVideo)}
|
|
468
501
|
</CapTooltip>
|
|
469
502
|
),
|
|
470
|
-
disabled:
|
|
503
|
+
disabled: host !== HOST_KARIX,
|
|
471
504
|
},
|
|
472
505
|
{
|
|
473
506
|
value: WHATSAPP_MEDIA_TYPES.DOCUMENT,
|
|
474
507
|
label: (
|
|
475
|
-
<CapTooltip
|
|
508
|
+
<CapTooltip
|
|
509
|
+
title={
|
|
510
|
+
host !== HOST_KARIX
|
|
511
|
+
? formatMessage(messages.disabledFeatureTooltip)
|
|
512
|
+
: ''
|
|
513
|
+
}>
|
|
476
514
|
{formatMessage(messages.mediaDocument)}
|
|
477
515
|
</CapTooltip>
|
|
478
516
|
),
|
|
479
|
-
disabled:
|
|
517
|
+
disabled: host !== HOST_KARIX,
|
|
480
518
|
},
|
|
481
519
|
];
|
|
482
520
|
|
|
@@ -684,6 +722,31 @@ export const Whatsapp = (props) => {
|
|
|
684
722
|
setKarixFileHandle('');
|
|
685
723
|
}, [whatsappImageSrc]);
|
|
686
724
|
|
|
725
|
+
const setUpdateWhatsappVideoSrc = useCallback(
|
|
726
|
+
(index, data) => {
|
|
727
|
+
setWhatsappVideoSrc(data?.videoSrc);
|
|
728
|
+
setKarixFileHandle(data?.fileHandle);
|
|
729
|
+
setWhatsappVideoPreviewImg(data?.previewUrl);
|
|
730
|
+
updateAssetList(data);
|
|
731
|
+
actions.clearWhatsappAsset(0);
|
|
732
|
+
},
|
|
733
|
+
[whatsappVideoSrc],
|
|
734
|
+
);
|
|
735
|
+
|
|
736
|
+
const setUpdateWhatsappDocSrc = useCallback(
|
|
737
|
+
(filePath, fileHandle) => {
|
|
738
|
+
setWhatsappDocSource(filePath);
|
|
739
|
+
setKarixFileHandle(fileHandle);
|
|
740
|
+
actions.clearWhatsappAsset(0);
|
|
741
|
+
},
|
|
742
|
+
[whatsappDocSource],
|
|
743
|
+
);
|
|
744
|
+
|
|
745
|
+
const updateOnWhatsappDocReUpload = useCallback(() => {
|
|
746
|
+
setWhatsappDocSource('');
|
|
747
|
+
setKarixFileHandle('');
|
|
748
|
+
}, [whatsappDocSource]);
|
|
749
|
+
|
|
687
750
|
const renderImageComponent = () => (
|
|
688
751
|
<CapImageUpload
|
|
689
752
|
style={{ paddingTop: '20px' }}
|
|
@@ -702,6 +765,44 @@ export const Whatsapp = (props) => {
|
|
|
702
765
|
/>
|
|
703
766
|
);
|
|
704
767
|
|
|
768
|
+
const renderVideoComonent = () => (
|
|
769
|
+
<CapVideoUpload
|
|
770
|
+
index={0}
|
|
771
|
+
allowedExtensionsRegex={ALLOWED_EXTENSIONS_VIDEO_REGEX}
|
|
772
|
+
videoSize={WHATSAPP_VIDEO_SIZE}
|
|
773
|
+
isFullMode={isFullMode}
|
|
774
|
+
uploadAsset={uploadWhatsappImage}
|
|
775
|
+
uploadedAssetList={assetList}
|
|
776
|
+
onVideoUploadUpdateAssestList={setUpdateWhatsappVideoSrc}
|
|
777
|
+
videoData={editData}
|
|
778
|
+
className="cap-custom-video-upload"
|
|
779
|
+
channel={WHATSAPP}
|
|
780
|
+
/>
|
|
781
|
+
);
|
|
782
|
+
const docPreview = ( whatsappDocSource !== '' &&
|
|
783
|
+
getWhatsappDocPreview(whatsappDocParams)
|
|
784
|
+
);
|
|
785
|
+
const renderDocumentComponent = () => (
|
|
786
|
+
<CapDocumentUpload
|
|
787
|
+
style={{ paddingTop: '20px' }}
|
|
788
|
+
allowedExtensionsRegex={ALLOWED_EXTENSIONS_DOCUMENT_REGEX}
|
|
789
|
+
documentSize={WHATSAPP_DOCUMENT_SIZE}
|
|
790
|
+
uploadAsset={uploadWhatsappImage}
|
|
791
|
+
isFullMode={isFullMode}
|
|
792
|
+
documentSrc={whatsappDocSource}
|
|
793
|
+
updateDocumentSrc={setUpdateWhatsappDocSrc}
|
|
794
|
+
updateOnReUpload={updateOnWhatsappDocReUpload}
|
|
795
|
+
index={0}
|
|
796
|
+
className="cap-custom-document-upload"
|
|
797
|
+
key="whatsapp-uploaded-document"
|
|
798
|
+
documentData={editData}
|
|
799
|
+
whatsappDocParams={whatsappDocParams}
|
|
800
|
+
setWhatsappDocParams={setWhatsappDocParams}
|
|
801
|
+
channel={WHATSAPP}
|
|
802
|
+
docPreview={docPreview}
|
|
803
|
+
/>
|
|
804
|
+
);
|
|
805
|
+
|
|
705
806
|
const onTemplateNameChange = ({ target: { value } }) => {
|
|
706
807
|
setTemplateName(value);
|
|
707
808
|
templateNameErrorHandler(value);
|
|
@@ -857,7 +958,17 @@ export const Whatsapp = (props) => {
|
|
|
857
958
|
}),
|
|
858
959
|
mediaType: templateMediaType,
|
|
859
960
|
...(isMediaTypeImage && {
|
|
860
|
-
imageUrl: getCdnUrl({url: whatsappImageSrc, channelName: 'WHATSAPP'
|
|
961
|
+
imageUrl: getCdnUrl({url: whatsappImageSrc, channelName: 'WHATSAPP' }),
|
|
962
|
+
karixFileHandle,
|
|
963
|
+
}),
|
|
964
|
+
...(isMediaTypeVideo && {
|
|
965
|
+
videoUrl: getCdnUrl({url: whatsappVideoSrc, channelName: 'WHATSAPP'}),
|
|
966
|
+
karixFileHandle,
|
|
967
|
+
videoPreviewImg: getCdnUrl({url: whatsappVideoPreviewImg, channelName: 'WHATSAPP'}),
|
|
968
|
+
}),
|
|
969
|
+
...(isMediaTypeDoc && {
|
|
970
|
+
documentUrl: getCdnUrl({url: whatsappDocSource, channelName: 'WHATSAPP'}),
|
|
971
|
+
whatsappDocParams,
|
|
861
972
|
karixFileHandle,
|
|
862
973
|
}),
|
|
863
974
|
varMapped: !isFullMode ? varMap : {},
|
|
@@ -1019,6 +1130,8 @@ export const Whatsapp = (props) => {
|
|
|
1019
1130
|
{/* template media type */}
|
|
1020
1131
|
{renderMediaSection()}
|
|
1021
1132
|
{isMediaTypeImage && renderImageComponent()}
|
|
1133
|
+
{isMediaTypeVideo && renderVideoComonent()}
|
|
1134
|
+
{isMediaTypeDoc && renderDocumentComponent()}
|
|
1022
1135
|
{/* template message create flow */}
|
|
1023
1136
|
<CapHeader
|
|
1024
1137
|
className={`${isMediaTypeImage ? 'whatsapp-heading-spacing' : ''}`}
|
|
@@ -1252,6 +1365,8 @@ export const Whatsapp = (props) => {
|
|
|
1252
1365
|
{renderLabel('mediaLabel')}
|
|
1253
1366
|
<CapLabel type="label15">{capitalizeString(templateMediaType)}</CapLabel>
|
|
1254
1367
|
{isMediaTypeImage && renderImageComponent()}
|
|
1368
|
+
{isMediaTypeVideo && renderVideoComonent()}
|
|
1369
|
+
{isMediaTypeDoc && renderDocumentComponent()}
|
|
1255
1370
|
|
|
1256
1371
|
<CapRow className="whatsapp-render-heading">
|
|
1257
1372
|
<CapHeader
|
|
@@ -1343,6 +1458,12 @@ export const Whatsapp = (props) => {
|
|
|
1343
1458
|
...(isMediaTypeImage && {
|
|
1344
1459
|
whatsappImageSrc,
|
|
1345
1460
|
}),
|
|
1461
|
+
...(isMediaTypeVideo && {
|
|
1462
|
+
whatsappVideoPreviewImg,
|
|
1463
|
+
}),
|
|
1464
|
+
...(isMediaTypeDoc && {
|
|
1465
|
+
docPreview,
|
|
1466
|
+
}),
|
|
1346
1467
|
templateMsg,
|
|
1347
1468
|
...(isBtnTypeCta && {
|
|
1348
1469
|
ctaData,
|
|
@@ -1444,4 +1565,4 @@ export default withCreatives({
|
|
|
1444
1565
|
mapStateToProps,
|
|
1445
1566
|
mapDispatchToProps,
|
|
1446
1567
|
userAuth: true,
|
|
1447
|
-
});
|
|
1568
|
+
});
|
|
@@ -132,4 +132,21 @@
|
|
|
132
132
|
color: $FONT_COLOR_05;
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
.cap-custom-video-upload {
|
|
136
|
+
padding-top: 20px;
|
|
137
|
+
.dragger-button.re-upload {
|
|
138
|
+
top: -175px;
|
|
139
|
+
position: relative;
|
|
140
|
+
left: 525px;
|
|
141
|
+
color: $FONT_COLOR_05;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
.cap-custom-document-upload {
|
|
145
|
+
.dragger-button.re-upload {
|
|
146
|
+
top: -150px;
|
|
147
|
+
position: relative;
|
|
148
|
+
left: 525px;
|
|
149
|
+
color: $FONT_COLOR_05;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
135
152
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.pdf-img-box {
|
|
2
|
+
width: 162px;
|
|
3
|
+
height: 80px;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
}
|
|
6
|
+
.pdf-preview-img {
|
|
7
|
+
width: 162px;
|
|
8
|
+
}
|
|
9
|
+
.pdf-label {
|
|
10
|
+
width: 162px;
|
|
11
|
+
height: 44px;
|
|
12
|
+
background-color: #F4F5F7;
|
|
13
|
+
display: flex;
|
|
14
|
+
.cap-image-v2 {
|
|
15
|
+
margin: 6px 4px;
|
|
16
|
+
width: 32px;
|
|
17
|
+
height: 32px;
|
|
18
|
+
}
|
|
19
|
+
.pdf-info {
|
|
20
|
+
margin: 8px 4px;
|
|
21
|
+
max-width: 114px;
|
|
22
|
+
.pdf-info-sec {
|
|
23
|
+
color: #5f6d85;
|
|
24
|
+
font-size: 8px;
|
|
25
|
+
font-weight: 400;
|
|
26
|
+
line-height: 12px;
|
|
27
|
+
}
|
|
28
|
+
.pdf-name-div {
|
|
29
|
+
display: flex;
|
|
30
|
+
.pdf-name{
|
|
31
|
+
max-width: 112px;
|
|
32
|
+
text-overflow: ellipsis;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
white-space: nowrap;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|