կարիքը: Այն նաև կարող է af...">
,需要通过父级DOM结构来判断
*/
var trackActionPhone = function (node) {
var nodeInnerText = node.innerText || '';
if (!limitRegLength(nodeInnerText)) return;
var nodeText = trimText(nodeInnerText);
if (nodeText.length < 5 || nodeText.length > 20) return false;
var type =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: 'click';
var str = trimText(node.href || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
/** 排查父级嵌套非标签场景,并且对dom的正则校验做一个性能兜底,通过控制innerText的长度,来确保正则的性能 */
var fatherText = trimText(node.parentNode.innerText || '');
if (fatherText.length < 5 || fatherText.length > 20) return false;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
return false;
};
window.addEventListener('click', function (e) {
var node = e.target;
/** 社媒点击 */
var appName = '';
var getAppAriaLabel =
node.ariaLabel || node.parentNode.ariaLabel || '';
if (mediaList.includes(getAppAriaLabel.toLowerCase())) {
appName = getAppAriaLabel;
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'a'
) {
appName = getMediaName(node.href) || getMediaName(node.alt);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'img'
) {
appName = getMediaName(node.alt) || getMediaName(node.src);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'i'
) {
appName = getMediaName(node.className);
}
if (appName) {
_paq.push(['trackEvent', 'click', 'contactApp', appName]);
return;
}
/** 联系方式点击 */
if (trackActionPhone(node, 'click')) return;
if (node.nodeName && node.nodeName.toLowerCase() === 'a') {
var val = node.href;
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
if (node.nodeName && node.nodeName.toLowerCase() === 'i') {
var val = node.className;
var content = node.parentNode.href || '';
if (val.includes('email')) {
_paq.push(['trackEvent', 'click', 'email', content]);
return;
}
}
var nodeChildList = node.childNodes;
for (var i = 0; i < nodeChildList.length; i++) {
if (nodeChildList[i].nodeType !== 3) continue;
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '');
if (!limitRegLength(val)) continue;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
trackNumberData(node);
});
window.addEventListener('copy', function (e) {
if (trackActionPhone(e.target, 'copy')) return;
var text = e.target.textContent;
if (!text) return;
var val = text.replace(/\s:?/g, '');
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'copy', 'email', val]);
return;
}
trackNumberData(e.target);
});
}
trackContactInit();
/**
* 基于custom_inquiry_form.js 以及 form.js 对于询盘表单提交的实现,来反推询盘表单的input标签触发,用来收集意向客户
* 1. 缓存的KEY:TRACK_INPUT_ID_MTM_00;
* 2. 缓存策略 - lockTrackInput:单个页面内,10分钟内,不重复上报
*/
function trackActionInput() {
const CACHE_KEY = 'TRACK_INPUT_ID_MTM_00';
const pathName = window.location.hostname + window.location.pathname;
var lockTrackInput = function () {
try {
const lastCacheData = localStorage.getItem(CACHE_KEY);
if (!lastCacheData) return false;
const cacheData = JSON.parse(lastCacheData);
const cacheTime = cacheData[pathName];
if (!cacheTime) return false;
return Date.now() - cacheTime < 1000 * 60 * 10; // 10分钟内,不重复上报
} catch (error) {
console.error('lockTrackInput Error', error);
return false;
}
};
var setInputTrackId = function () {
try {
const curCacheData = localStorage.getItem(CACHE_KEY);
if (curCacheData) {
const cacheData = JSON.parse(curCacheData);
cacheData[pathName] = Date.now();
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
return;
}
const cacheData = {
[pathName]: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('setInputTrackId Error', error);
}
};
var getInputDom = function (initDom) {
var ele = initDom;
while (ele) {
/**
* isWebSiteForm 是站点的表单
* isChatWindowForm 是聊天窗口的表单
*/
/** 旧模板表单 */
var isWebSiteForm = !!(
/crm-form/i.test(ele.className) && ele.querySelector('form')
);
/** 1:新模板自定义表单、2:Get a Quote 弹框表单 */
var isWebSiteFormNew = !!(
/inquiry/i.test(ele.className) && ele.querySelector('form')
);
if (isWebSiteForm || isWebSiteFormNew) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'page']);
setInputTrackId();
return;
}
/** Mkt会话触达-聊天弹框的表单输入: MKT由于是iframe嵌入,所以MKT的上报,会单独写到MKT-form代码上 */
var isInquiryChatForm = !!(
/comp-form/i.test(ele.className) && ele.querySelector('form')
);
if (isInquiryChatForm) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'chat']);
setInputTrackId();
return;
}
/** 向上查找父节点 */
ele = ele.parentNode;
}
};
function initInputListener() {
var inputUseDebounce = function (fn, delay) {
var timer = null;
var that = this;
return function () {
var args = Array.prototype.slice.call(arguments);
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
var optimizeGetInputDom = inputUseDebounce(getInputDom, 300);
window.addEventListener('input', function (e) {
/** 如果已经上报过,则不再上报 */
if (lockTrackInput()) return;
optimizeGetInputDom(e.target);
});
}
try {
initInputListener();
} catch (error) {
console.log('initInputListener Error', error);
}
}
trackActionInput();
}
/** 第三方消息上报:目前主要是针对全点托管会话;在msgCollect/index.js中调试,访问test.html */
function thirdMsgCollect() {
/** 先检测是否是stayReal托管:如果stayReal脚本都没有,那么说明当前站点未开启stayReal会话托管 */
const scriptList = Array.prototype.slice.call(
document.querySelectorAll('script'),
);
const checkStayReal = () =>
!!scriptList.find((s) => s.src.includes('stayreal.xiaoman.cn'));
if (!checkStayReal()) return;
/** 缓存当前消息队列的最后一条消息id */
const CACHE_KEY = 'CACHE_KEY_MONITOR';
const setCache = (msgIndex) => {
/** 对缓存KEY进行base64转码处理 */
const cacheMsgIndex = btoa(msgIndex);
localStorage.setItem(CACHE_KEY, cacheMsgIndex);
};
const getCache = () => {
const cacheMsgIndex = localStorage.getItem(CACHE_KEY);
if (cacheMsgIndex) return Number(atob(cacheMsgIndex));
return -1;
};
/** 拉取最新msg列表 */
const pullMsgList = () => {
const msgEleList = Array.prototype.slice.call(
document.querySelectorAll('#chat-list li'),
);
const msgIds = [];
const msgMap = msgEleList.reduce((acc, item) => {
const sendTime = item
.querySelector('.message-data-time')
.textContent.trim();
const sendContent = item.querySelector('.message').textContent.trim();
/** msg带有class:other-message的是访客消息,my-message的是客服消息 */
const isOtherMessage = item
.querySelector('.message')
.classList.contains('other-message');
const msgId = item.querySelector('.message').getAttribute('id');
const msgItemData = {
msgId,
user: isOtherMessage ? 'visitor' : 'official',
time: sendTime,
content: sendContent,
};
msgIds.push(msgId);
acc[msgId] = msgItemData;
return acc;
}, {});
return {
ids: msgIds,
dataMap: msgMap,
};
};
/** 加密并上传消息数据 */
let ENCRYPT_KEY = 'de29f1aab63ab033';
let ENCRYPT_IV = 'b8d2badf875e76ac';
const baseUrl = 'https://cms.xiaoman.cn';
// var getEncryptConfig = function () {
// const url = baseUrl + '/shop-api/innerApi/getKeyIv'
// $.get(
// url,
// function (result) {
// console.log('result', result)
// if (Number(result.code) === 0 && result.data.key && result.data.iv) {
// ENCRYPT_KEY = result.data.key
// ENCRYPT_IV = result.data.iv
// uploadMsgData()
// } else {
// /** 如果获取失败,则重试 */
// setTimeout(() => {
// getEncryptConfig()
// }, 1000)
// }
// },
// 'json'
// )
// }
// getEncryptConfig()
const encryptMsg = function (msgData) {
const enc = new TextEncoder();
// 转字节
const keyBytes = enc.encode(ENCRYPT_KEY);
const ivBytes = enc.encode(ENCRYPT_IV);
const plainBytes = enc.encode(msgData);
// 导入密钥并加密
return crypto.subtle
.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, ['encrypt'])
.then(function (cryptoKey) {
return crypto.subtle.encrypt(
{ name: 'AES-CBC', iv: ivBytes },
cryptoKey,
plainBytes,
);
})
.then(function (encryptedBuffer) {
// 转 base64 返回
return btoa(
String.fromCharCode(...new Uint8Array(encryptedBuffer)),
);
})
.catch((err) => {
return Promise.reject(err);
});
};
let uploadFlag = false;
const uploadMsgData = function () {
if (uploadFlag) return;
uploadFlag = true;
const { ids, dataMap } = pullMsgList();
let cacheMsgIndex = getCache();
const msgLen = ids.length;
if (!msgLen) {
// 消息DOM未挂载 || 消息DOM已挂载,但是消息列表为空
uploadFlag = false;
return;
}
if (msgLen - 1 < cacheMsgIndex) {
/** 针对站点挂后台一段时间,消息列表会自动塞入重复消息,导致消息有重复,刷新后又重置回正常消息列表,所以这里需要更新锚点下标 */
cacheMsgIndex = msgLen - 1;
setCache(cacheMsgIndex);
uploadFlag = false;
return;
}
if (msgLen - 1 === cacheMsgIndex) {
// 缓存的最后一次发送的消息ID是最后一条(说明当前消息均已经上报),则不跳过本地上报
uploadFlag = false;
return;
}
const currentMsgIds = ids.slice(cacheMsgIndex + 1, msgLen);
const currentMsgData = currentMsgIds.map((id) => dataMap[id]);
const mtmId = window.matomo_site_id_cookie_key || ''; // 获取mtm会话id
const msgBody = {
mtmId,
curl: window.location.href,
msgList: currentMsgData,
};
const msgBodyStr = JSON.stringify(msgBody);
encryptMsg(msgBodyStr)
.then(function (encryptedMsg) {
console.log('encryptedMsg:', encryptedMsg, msgBodyStr);
const url = baseUrl + '/shop-api/External/ListenSiteActiveStatus';
$.ajax({
type: 'POST',
url,
data: JSON.stringify({ d_v: encryptedMsg }),
contentType: 'application/json',
success: function (result) {
if (Number(result.code) === 0) {
// 更新消息队列
setCache(msgLen - 1);
}
uploadFlag = false;
},
error: function (err) {
console.error(err, '请求异常');
uploadFlag = false;
},
});
})
.catch((err) => {
console.error(err, '数据加密失败');
uploadFlag = false;
});
};
/** 监控chat-list的DOM变更 */
const initChatListObserver = () => {
// 需要监听的 DOM 节点
const target = document.getElementById('chat-list');
if (!target) return;
// 回调函数
const callback = function (mutationsList, observer) {
for (const mutation of mutationsList) {
console.log('mutation', mutation);
if (mutation.type === 'childList') {
uploadMsgData();
}
}
};
// 配置
const config = {
childList: true, // 监听子节点的增删
subtree: true, // 是否也监听后代节点
};
// 创建 observer
const observer = new MutationObserver(callback);
// 开始监听
observer.observe(target, config);
};
let testCount = 30;
let itv = null;
const checkChatDom = () => !!document.querySelector('#vc-model');
const initTalkCheck = () => {
itv = setTimeout(() => {
console.log('checkChatDom', checkChatDom(), testCount);
if (!checkChatDom() && testCount > 0) {
testCount--;
initTalkCheck();
return;
}
clearTimeout(itv);
uploadMsgData();
initChatListObserver();
}, 1500);
};
initTalkCheck();
}
try {
gtmTrack();
thirdMsgCollect();
console.log('inserted gtm code');
} catch (error) {
console.error('gtmTrack Error', error);
}
});
})();
CDPH-ում մենք հասկանում ենք, որ անհրաժեշտ է լավ կառավարվող արկեղների պահեստ դա նաև կարող է ազդել ձեր իրերը տեղադրելու և պահելու արագության և արդյունավետության վրա: Մենք ընդլայնել ենք այն օգուտների ցանկը, որոնք ստանում եք մեզնից պատվիրելիս՝ նախնական փորձաքննություն անցած առկղերի մատակարարներ, արտադրանքներ, որոնք համապատասխանում են մեր բարձր որակի չափանիշներին, ընդհանուր օգտակար առկղերի առաքման հարցեր, որոնք պետք է հաշվի առնել, ինչպես նաև մի քանի առաջատար առկղերի խանութների մոտ մարկետինգային գներ, ինչպես օրինակ՝ ձեր առկղերի կազմակերպում: Երբ խոսքը գալիս է CDPH-ի կոնտեյներային խանութի տարբերակների մասին, դուք կարող եք վայելել շատ առավելություններ: Գերազանց լավ տարբեր կիրառությունների համար, մեր կոնտեյներները ամուր են, տևական և հասանելի են մինչև երկու ֆունտ չափսերով: Եթե ձեզ անհրաժեշտ է պահել սնունդ, անձնական իրեր, հագուստ, գործիքներ կամ արժեքավոր վաճառքի հետ կապված ապրանքներ՝ մեր բեռնարկղեր թույլ են տալիս պահել այդ առարկաները անձրևից, արևի ուժեղ ճառագայթներից և միաժամանակ պահել դրանք կարգուկանոնում: Առնչվող ապրանքներ: Մեր տուփերը մատչելի գներով են և առկա են շատ տարբեր չափերով՝ համապատասխանեցված ձեր պահանջներին: Բարձրորակ արկեղների պահեստ ապրանքների մեծածախ ձեռքբերման համար CDPH-ն ամեն ինչ ունի: Մենք օգտագործում ենք բարձրորակ նյութեր, որոնք նախագծված են երկար ժամկետ ծառայելու համար, ուստի դուք ձեր գումարի համար առավելագույն արժեք եք ստանում: Մենք ամեն ինչ ունենք՝ սկսած իրար վրա կարող դասավորվող տուփերից մինչև թափանցիկ պլաստիկ տուփեր կափարիչներով՝ ձեր ապրանքները ցուցադրելու հնարավորությամբ, և ամեն ինչ դրանց միջև: Երբ ընտրում եք CDPH-ն ձեր մեծածախ տուփերի պահանջների համար, գիտակցում եք, որ ստանում եք ապրանքների առավելագույն որակ: Չնայած կոնտեյներների կազմակերպումը կարող է ամբողջությամբ օգտակար լինել, կան որոշ հաճախ հանդիպող խնդիրներ, որոնց վերաբերյալ պետք է տեղեկացված լինեք: Մենք սովորություն ունենք այս կոնտեյները չափից ավելի լի անելու, ինչը շատ արդյունավետ չէ, երբ փորձում եք գտնել և հանել ձեր իրերը: Դուք պետք է պարբերաբար ստուգեք ձեր տուփերը և հեռացրեք ավելորդ իրերը՝ ցանկացած պահի, որպեսզի համոզվեք, որ պահեստավորման տարածքը օգտագործվում է առավել արդյունավետ կերպով: Ավելին, կարող եք պիտակավորել ձեր կոնտեյներները՝ այն առարկան գտնելու համար, որը ձեզ պետք է: CDPH-ում մենք առաջարկում ենք կոնտեյների խանութի ապրանքներ այնպիսի գնով, ինչպիսին առցանց այլ որտեղ չեք կարող գտնել: Ե whether ձեզ մի քանի կոնտեյներ են անհրաժեշտ անձամբ օգտագործելու համար, թե առևտրային նպատակներով մեծ քանակությամբ, մենք ունենք ամեն ինչ, ինչ ձեզ պետք է: Մեր մեծածախ գները շուկայում ամենացածրն են, ուստի կարող եք համոզված լինել, որ ձեր գումարի համար ստանում եք գերազանց արժեք: CDPH-ում մենք նվիրված ենք ձեզ առաջարկելու բարձրորակ կոնտեյներնեի խանութի ապրանքներ աննախադեպ գներով: Նախասարքված տունը կառուցված է հատուկ կոնստրուկտիվ դիզայնով և ունի լավ սեյսմիկ կատարողականություն՝ ապահովելու անվտանգությունը: Մոդուլային դիզայնը հեշտությամբ տեղափոխվում է, տեղադրվում և կարող է պատվիրատու լինել Container store-ում՝ ձեր անհատական նախընտրություններին համապատասխան՝ տարբեր ոճերով, սենյակների տեսակներով: Բոլոր տարրերը պատրաստված են նախասարքված նյութերից և հեշտ են տեղադրվում՝ առանց հատուկ հմտությունների պահանջի: Անկախ նրանից, թե այն նախատեսված է գրասենյակի, ապրելու կամ պահեստավորման համար, թե այլ դեպքերի, նախասարքված տունը կարող է բավարարել ձեր պահանջները: Ոճային արտաքին տեսք, հարթ գծեր և կարող է հարմարեցվել ձեր անհատական նախընտրություններին՝ ստեղծելով անհատական ապրելու տարածք: Ամենալավ այն է, որ նախասարքված տները չի պահանջվում լինի տեղում կապել, և մենք տրամադրում ենք հրահանգներ տեղադրման համար՝ դարձնելով այն ավելի հեշտ և արագ: Ընդունեք ավելի հարմարավետ կյանքի առավելությունները Chengdong-ի նախասարքված տների հետ: Chengdong-ի նախասարքված տներ: Ծիածանե խուղ, եզակի ձև, գեղեցիկ տեսք, ձեր տունը ավելի անհատականացված դարձնելու համար: Մենք առաջարկում ենք ձեր անձնական ճաշակին՝ պարզ ժամանակակիցից մինչև վինտաժ ոճերին համապատասխան տարբեր ոճեր և գույներ: Պեկինի Չենգդոնգը կենտրոնացած է օգտատիրոջ ցանկությունների վրա, և այն կարող է ձևավորվել ձեր պահանջներին համապատասխան: Ձեր անհատական նախընտրություններին և ցանկություններին համապատասխան՝ դուք կարող եք փոխել ձեր տան ձևը, ներքին կազմածրագրությունը, ջրամատակարարումը, էլեկտրամատակարարումը և այլն, որպեսզի ստեղծեք ձեզ համար իդեալական անհատական տուն: Մենք նախնական տեղադրել ենք էլեկտրականության և ջրի համակարգերը, որը բացառում է կոնտեյներային խանութներում տնից հետո ջրային և էլեկտրական համակարգերը վերակազմակերպելու անհրաժեշտությունը, ինչպես նաև բարձրացնում է հարդարման արդյունավետությունն ու որակը: Մենք առաջարկում ենք ներքին տարածքների տարբեր կազմածրագրության տարբերակներ՝ ննջարան, ճաշարան, նստարան և լոգարան և այլն: Դուք կարող եք ընտրել ձեր պահանջներին և նախընտրություններին համապատասխան՝ ձեզ համար եզակի իդեալական տնային միջավայր ստեղծելու համար: Apple House - Կյանքի որակը իր լավագույնում: Apple House-ը հատուկ վայր է: Ավելացրեք անվտանգություն և հարմարավետություն ձեր տանը՝ տեղադրելով կոնտեյներներ: Մենք օգտագործում ենք կոնտեյներային պահեստ, որը ներառում է բոլոր կառուցվածքային բաղադրիչները: Դրանք բոլորը պատրաստվում են գործարանային ստանդարտներին համապատասխան՝ նախապատրաստված վիճակում: Ընտրեք ճիշտ չափսը և կոնֆիգուրացիան, և դուք կարող եք արագ կառուցել ապրելու տարածք՝ համապատասխանելով ձեր պահանջներին: Հիմնվելով հաճախորդի պահանջների և նախընտրությունների վրա, տարբեր մոդուլները կարող են միավորվել՝ ստեղծելով տարբեր սենյակների դասավորություններ, ինչպես օրինակ՝ խոհանոց, նախասենյակ կամ մասնական սենյակ: Մեր կոնտեյներային տունը ունի հիասքանչ հատկանիշներ, ինչպես օրինակ՝ ջրամերժություն, խոնավամերժություն, կոռոզիայի դեմ կայունություն, հրակայունություն և կրկին՝ կոռոզիայի դեմ կայունություն: Տեղադրման գործընթացը հեշտ է և պարզ, և որևէ հատուկ տեխնիկական գիտելիք չի պահանջում: Այն լինի ձեր անձնական տարածքը, ժամանակավոր գրասենյակը, պահեստը կամ այլ պահանջները՝ մեր նախապատրաստված կոնտեյներային տները նախագծված են բավարարելու ձեր պահանջները: Այսօր ձեռք բերեք կոնտեյներային սենյակ և վայելեք ցածր արժեք և ավելի հարգալից սպասարկում՝ ձեր կյանքը ավելի հաճելի դարձնելու համար: Ծալվող տունը հետևում է կոնտեյներային պահեստին, որը կարող է դասավորվել ձեր պահանջներին համապատասխան՝ արտադրությունը մեծացնելու և ձեր բնակելի տարածքը ավելի ապահով, կայուն ու հուսալի դարձնելու նպատակով: Սենյակը կարող է դասավորվել այնպես, որ բավարարի տարբեր պահանջները, այսինքն՝ դուք կարող եք զգալ ինքնազգացողություն ցանկացած վայրում և ցանկացած ժամանակ: Արագ առաքում! Փոխադրումն ու փաթեթավորումը չափազանց արագ են: Մենք ձեր նշված պահանջներին համապատասխան օգտագործում ենք փաթեթավորման մասնագիտացված թիմ՝ ծալվող սենյակի փաթեթավորման համար, որպեսզի ձեզ հասնի բարձրագույն որակի ապրանք: Մենք հսկում ենք ամբողջ առաքման գործընթացը՝ համոզվելու համար, որ ձեր ապրանքները անվտանգ կհասնեն նշված վայր: Ամենակարևորը՝ ծալվող սենյակը հեշտ է տեղադրել՝ առանց վայրի վրա եռացման, և մենք տրամադրում ենք տեղադրման ցուցումներ՝ ձեր տեղադրման գործընթացը ավելի արագ և հեշտ դարձնելու համար: Եթե հետևեք ցուցումներին, ծալվող տունը տեղադրելը շատ հեշտ է: CDPH արտադրում է և վաճառում է տարբեր տեսական մոդուլային տուներ, Պրեֆաբ Տուներ և Վիլլային Տուներ։ -produktների լայն տարածքը մեզ համոզված է տալիս մեկ համապատասխան լուծում յուրաքանչյուր ենգիների կամպի համար։Արկեղների պահեստ
Մեր կոնտեյներային խանութի առավելությունները

Բարձրորակ ապրանքներ մեծածախ գնողների համար

Կոնտեյներների կազմակերպման հետ կապված հաճախ հանդիպող խնդիրներ

Լավագույն կոնտեյներային խանութի արտադրանքների մեծածախ գներ
Why choose CDPH
Արկեղների պահեստ?
Նոր գալակտիկայի պրեֆաբրիկացիայից տուն
Սիրովանկային stile apple
Լավ Վաճառք արանջական տուն
Բարձր որակի folding տուն
Առաջարկվող ապրանքային կատեգորիաներ
Չե՞ս գտնում որ որ ես փնտրում ես։
ҔԱԾԵԼ ԳԾԵՐԱԾ ԱԾԱԾԵԼ
Կապ հաստատեք մեր խորհրդատուների հետ՝ ավելի շատ առաջացված ապրանքների մասին։Կապ հաստատել
27+ Տարի փորձ
Ենգիների Կամպի Կառուցում