आप अमेजन s3 बाल्टी को कैसे खोजते हैं?


159

मेरे पास एक बाल्टी है जिसमें हजारों फाइलें हैं। मैं बाल्टी को कैसे खोज सकता हूं? क्या कोई उपकरण है जिसे आप सुझा सकते हैं?


मेरे पास कई बाल्टी हैं, इसलिए मैंने उन सभी के माध्यम से खोज करने के लिए एक छोटी स्क्रिप्ट लिखी: github.com/laurenfitch/utilities/blob/master/query_s3.py
लॉरेन फिच

जवाबों:


31

S3 में मूल सामग्री अज्ञात होने के बाद से "मूल रूप से इस बकेट को खोजें" नहीं है - इसलिए, क्योंकि S3 कुंजी / मूल्य आधारित है, एक बार में कई नोड्स तक पहुंचने के लिए कोई मूल तरीका नहीं है, जो एक पारंपरिक (SELECT * FROM ... WHERE ...)एसक्यूएल डेटास्टोर्स पर एक एसक्यूएल (एक एसक्यूएल) प्रदान करता है। नमूना)।

आपको ListBucketबाल्टी में वस्तुओं की एक सूची प्राप्त करने के लिए प्रदर्शन करने की आवश्यकता होगी और फिर आपके द्वारा लागू किए जाने वाले एक कस्टम ऑपरेशन को निष्पादित करने वाले प्रत्येक आइटम पर पुनरावृति - जो आपकी खोज है।


42
यह अब मामला ही नहीं है। नीचे रोंडा का जवाब देखें: stackoverflow.com/a/21836343/1101095
Nate

11
उपरोक्त टिप्पणी के सभी अपवर्जकों को: ओपी नॉट इंगित करता है कि वे फ़ाइल नाम या प्रमुख सामग्री (जैसे फ़ाइल सामग्री) को खोजना चाहते हैं या नहीं। तो @ रोंडा का जवाब अभी भी पर्याप्त नहीं हो सकता है। ऐसा प्रतीत होता है कि अंततः यह उपभोक्ता के लिए बचा हुआ व्यायाम है, क्योंकि S3 कंसोल का उपयोग करना शायद ही आपके ऐप उपयोगकर्ताओं और सामान्य उपयोगकर्ताओं के लिए उपलब्ध हो। यह मूल रूप से केवल बाल्टी के मालिक और / या IAM भूमिकाओं के लिए पुनर्जीवित होता है।
कोडी कॉगलन

क्या इन बकेट डॉक्यूमेंट्स को इंडेक्स करने के लिए ल्यूकेन.नेट जैसी कोई इंडेक्सिंग सर्विस है।
मुनव्वर

मैं इस जवाब पर वापस आता रहा और मदद के लिए एक उपकरण बनाया: bucketsearch.net - वाइल्डकार्ड खोज आदि के लिए अनुमति देता है
जॉन एम

251

यहां पर जोड़ने के लिए बस एक नोट: यह अब 3 साल बाद है, फिर भी यह पोस्ट Google में शीर्ष पर है जब आप "S3 बाल्टी की खोज कैसे करें" टाइप करते हैं।

शायद आप कुछ अधिक जटिल की तलाश कर रहे हैं, लेकिन यदि आप यहां यह पता लगाने की कोशिश कर रहे हैं कि किसी वस्तु (फ़ाइल) को शीर्षक से कैसे ढूंढा जाए, तो यह सरल है:

बाल्टी खोलें, दाहिने हाथ की तरफ "कोई नहीं" चुनें, और फ़ाइल नाम टाइप करना शुरू करें।

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html


43
यही वह है जिसकी तलाश में मैं हूं। भयानक उपयोगकर्ता अनुभव डिज़ाइन में शून्य दृश्य संकेत हैं
कीथ एंट्ज़रोथ

2
बाल्टी में एक फ़ाइल का चयन करने की आवश्यकता है, फिर टाइप करना शुरू करें।
काबे 56

30
अभी भी केवल आइटम नाम के उपसर्ग द्वारा खोज करते हैं।
डैनियल फ़्लिपेंस

21
यह पूरी तरह से उल्लंघन है! लोग दाहिने हाथ की ओर या पीले बॉक्स में कुछ के बारे में बात कर रहे हैं, लेकिन मुझे कुछ भी नहीं मिल रहा है। बस एक ही "उपसर्ग में टाइप करें ..." संदेश। कैसे "खोज बाल्टी" डिफ़ॉल्ट नहीं है ?? यह लगभग उतना ही अनदेखा है जितना कि
एटलसियन

40
क्या यह जवाब अभी भी चालू है? मुझे दाहिने हाथ की तरफ कोई '' कोई नहीं '' और उत्तर में दिए गए दस्तावेज़ीकरण लिंक अब अलग पृष्ठ पर दिखाई नहीं देते।
बिस्किटबकेर

112

AWS CLI का उपयोग करके खोज फ़ाइल नाम करने का एक छोटा और बदसूरत तरीका है :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-

1
aws s3 ls s3: // your-bucket --recursive | grep your-search मेरी खोज के लिए काफी अच्छा था, धन्यवाद अबे वोल्कर।
man.2067067

3
सभी बाल्टियाँ: aws s3 ls | awk '{प्रिंट $ 3}' | पढ़ी जाने वाली पंक्ति; गूंज $ लाइन; aws s3 ss s3: // $ लाइन --recursive | grep अपनी खोज; किया
अकोम

1
क्या है कट -c 32- इसके बिना भी खोज काम कर रही है
सुनील

1
cut -c 32-बस टाइमस्टैम्प बंद कर देता है और आउटपुट से फ़ाइल आकार की जानकारी देता हूं, जो मेरे सिस्टम पर 32 अक्षर लेता है। आपको इसकी आवश्यकता नहीं है, लेकिन यदि आप आउटपुट को किसी अन्य कमांड में पाइप कर रहे हैं, तो यह "क्लीन" आउटपुट के लिए उपयोगी हो सकता है।
अबे वोल्कर

सीएलआई समर्थन करता है include/exclude। तो,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
मोहनीश

25

कम से कम दो अलग-अलग उपयोग मामले हैं जिन्हें "बाल्टी खोजें" के रूप में वर्णित किया जा सकता है:

  1. बाल्टी में संग्रहीत प्रत्येक वस्तु के अंदर कुछ के लिए खोजें ; यह उस बाल्टी में सभी वस्तुओं (जैसे, पाठ फ़ाइलें) आदि के लिए एक सामान्य प्रारूप मानता है। कुछ इस तरह के लिए, आप कोड़ी कॉगलन ने जो जवाब दिया, वह करने के लिए मजबूर किया जाता है। AWS S3 डॉक्स में उदाहरण कोड है जो यह बताता है कि जावा के लिए AWS SDK के साथ यह कैसे किया जाए: लिस्टिंग कुंजी जावा के लिए AWS SDK का उपयोग करना (वहां आपको PHP और C # उदाहरण भी मिलेंगे)।

  2. सूची आइटम उस बाल्टी में निहित ऑब्जेक्ट कुंजियों में कुछ के लिए खोजें ; S3 करता है आंशिक इस के लिए समर्थन, उपसर्ग सटीक मिलान + परिसीमक के बाद मैचों गिर अनुमति देता है के रूप में। यह AWS S3 डेवलपर गाइड पर अधिक विस्तार से बताया गया है । यह अनुमति देता है, उदाहरण के लिए, "फ़ोल्डर" को लागू करने के लिए ऑब्जेक्ट कुंजी के रूप में कुछ का उपयोग करके

    फ़ोल्डर / सबफ़ोल्डर / file.txt
    यदि आप इस सम्मेलन का पालन करते हैं, तो S3 GUI (जैसे AWS कंसोल) के अधिकांश भाग आपको अपनी बाल्टी का एक फ़ोल्डर दृश्य दिखाएंगे।



22

AWS ने SQL के साथ S3 बकेट क्वेरी करने के लिए एक नई सेवा जारी की: Amazon Athena https://aws.amazon.com/athena/


2
अर्ग ... मुझे मिल गया ... "एथेना यूएस वेस्ट (एन। कैलिफोर्निया) में उपलब्ध नहीं है। कृपया किसी अन्य क्षेत्र का चयन करें।"
क्लिंटम

2
यह सब इस SQL ​​क्वेरी के साथ एक ओवरहेड है जिसमें मैं केवल grep
अली गजनी

4
@ क्लिंट - हमारे लिए बदलाव-पूर्व -1 (एन। वर्जीनिया)
स्लोकुमरो

21

कई विकल्प हैं, कोई भी सरल "एक शॉट" पूर्ण पाठ समाधान नहीं है:

  1. कुंजी नाम पैटर्न खोज : कुछ स्ट्रिंग से शुरू होने वाली कुंजियों की खोज- यदि आप प्रमुख नामों को ध्यान से डिज़ाइन करते हैं, तो आपके पास त्वरित समाधान हो सकता है।

  2. कुंजी से संलग्न मेटाडेटा खोजें : AWS S3 में फ़ाइल पोस्ट करते समय, आप सामग्री को संसाधित कर सकते हैं, कुछ मेटा जानकारी निकाल सकते हैं और कुंजी में कस्टम हेडर के रूप में इस मेटा जानकारी को संलग्न कर सकते हैं। यह आपको पूरी सामग्री लाने की आवश्यकता के बिना प्रमुख नाम और हेडर लाने की अनुमति देता है। खोज को अनुक्रमिक रूप से किया जाना है, इसके लिए कोई "sql जैसा" खोज विकल्प नहीं है। बड़ी फ़ाइलों के साथ यह बहुत सारे नेटवर्क ट्रैफ़िक और समय को बचा सकता है।

  3. मेटाडाटा को स्टोर करें सिंपलडीबी पर : पिछले बिंदु के रूप में, लेकिन सिंपलडीबी पर मेटाडेटा को संग्रहीत करने के साथ। यहां आपके पास चुनिंदा कथनों की तरह sql है बड़े डेटा सेटों के मामले में, आप सिम्पलडीबी सीमा से टकरा सकते हैं, जिसे दूर किया जा सकता है (कई सिंपलडीबी डोमेन में विभाजन मेटाडेटा), लेकिन यदि आप वास्तव में बहुत दूर जाते हैं, तो आपको एक और मेटाडेटा प्रकार के डेटाबेस का उपयोग करने की आवश्यकता हो सकती है।

  4. सामग्री की अनुक्रमिक पूर्ण पाठ खोज - एक-एक करके सभी कुंजी को संसाधित करना। बहुत धीमी गति से, अगर आपके पास प्रक्रिया करने के लिए बहुत अधिक चाबियाँ हैं।

हम कुछ वर्षों के लिए फ़ाइल के 1440 संस्करणों को प्रति दिन (एक मिनट) स्टोर कर रहे हैं, संस्करणित बाल्टी का उपयोग करके, यह आसानी से संभव है। लेकिन कुछ पुराने संस्करण प्राप्त करने में समय लगता है, क्योंकि किसी को संस्करण द्वारा क्रमिक रूप से जाना पड़ता है। कभी-कभी मैं रिकॉर्ड्स के साथ सरल CSV इंडेक्स का उपयोग करता हूं, प्रकाशन समय प्लस संस्करण आईडी दिखा रहा है, इस होने के बाद, मैं पुराने संस्करण पर जल्दी से कूद सकता हूं।

जैसा कि आप देखते हैं, एडब्ल्यूएस एस 3 पूर्ण पाठ खोजों के लिए डिज़ाइन किया गया है, यह सरल भंडारण सेवा नहीं है।


4

S3 कंसोल में उपसर्ग द्वारा खोजें

सीधे AWS कंसोल बकेट दृश्य में।

यहां छवि विवरण दर्ज करें

प्रतिलिपि s3-dist-cp का उपयोग करके फ़ाइलें चाहता था

जब आपके पास वांछित फ़ाइलों को प्राप्त करने के लिए हजारों या लाखों फाइलें हैं, तो वितरित प्रतिलिपि का उपयोग करके उन्हें किसी अन्य स्थान पर कॉपी करना है । आप इसे Hadoop जॉब में EMR पर चलाते हैं । AWS के बारे में अच्छी बात यह है कि वे अपने कस्टम S3 संस्करण s3-dist-cp प्रदान करते हैं । यह आपको GroupBy फ़ील्ड में एक नियमित अभिव्यक्ति का उपयोग करके वांछित फ़ाइलों को समूह करने की अनुमति देता है। आप उदाहरण के लिए EMR पर एक कस्टम चरण में इसका उपयोग कर सकते हैं

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]

ऐसा प्रतीत होता है कि AWS कंसोल बकेट दृश्य फ़ाइल को फ़िल्टर करके फ़ाइल में नहीं जाता है। यह बहुत जल्दी परिणाम लौटाने में सक्षम है बशर्ते मैं जिस फ़ाइल की तलाश कर रहा हूं उसका विकल्प उपलब्ध हो। क्या एक ग्राहक / उपकरण / एपीआई है जो मैं एक ही समय पर मनोर में परिणाम प्राप्त करने के लिए एडब्ल्यूएस कंसोल के अलावा अन्य का उपयोग कर सकता हूं। @ हाई 6। अतीत में मैंने बोटो का उपयोग करने का प्रयास किया है, लेकिन सबसे अच्छा तरीका यह है कि पूरी बकेट को हर खोज के लिए आपके खोज मानदंडों को लागू करते हुए पुनरावृत्त होना दिखाई दिया। अर्थात। अत्यंत धीमी
कॉपी और पेस्ट

4

यदि आप विंडोज पर हैं और आपके पास एक अच्छा grepविकल्प खोजने का समय नहीं है , तो एक त्वरित और गंदा तरीका होगा:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

और फिर myfile.txt में क्विक-सर्च करें

"फ़ोल्डर" बिट वैकल्पिक है।

PS यदि आपके पास AWS सीएलआई स्थापित नहीं है - तो चॉकलेट पैकेज प्रबंधक का उपयोग करके एक लाइनर है

choco install awscli

पीपीएस यदि आपके पास चॉकलेट पैकेज प्रबंधक नहीं है - इसे प्राप्त करें! विंडोज पर आपका जीवन 10 गुना बेहतर हो जाएगा। (मैं चॉकलेट के साथ किसी भी तरह से संबद्ध नहीं हूं, लेकिन हे, यह बहुत जरूरी है, वास्तव में)।


अगर उपयोगकर्ता चोको स्थापित कर सकते हैं तो वे grep स्थापित कर सकते हैं, नहीं? या विंडोज़ की देशी खोज का उपयोग करें?
डीन रैडक्लिफ

2

यह देखते हुए कि आप AWS में हैं ... मुझे लगता है कि आप उनके CloudSearch टूल का उपयोग करना चाहेंगे। उन डेटा को डालें जिन्हें आप उनकी सेवा में खोजना चाहते हैं ... क्या यह S3 कुंजी की ओर इशारा करता है।

http://aws.amazon.com/cloudsearch/


7
वास्तव में ओपी बिल्कुल भी नहीं देख रहा था
क्लिंटम

मेरे लिए इसका मतलब यह होगा कि वहाँ सभी डेटा - डेटा का दोहराव
बीजी ब्रूनो

1

एक अन्य विकल्प अपने वेब सर्वर पर S3 बाल्टी को दर्पण करना और स्थानीय रूप से पार करना है। चाल यह है कि स्थानीय फाइलें खाली हैं और केवल कंकाल के रूप में उपयोग की जाती हैं। वैकल्पिक रूप से, स्थानीय फाइलें उपयोगी मेटा डेटा को पकड़ सकती हैं, जिन्हें आपको आमतौर पर S3 (जैसे कि filesize, mimetype, लेखक, टाइमस्टैम्प, यूआईडी) से प्राप्त करना होगा। जब आप फ़ाइल डाउनलोड करने के लिए एक URL प्रदान करते हैं, तो स्थानीय रूप से खोज करें लेकिन S3 पते के लिए एक लिंक प्रदान करें।

स्थानीय फ़ाइल ट्रैवर्सिंग आसान है और S3 प्रबंधन के लिए यह दृष्टिकोण भाषा अज्ञेय है। स्थानीय फ़ाइल ट्रैवर्सिंग भी फ़ाइलों के डेटाबेस को बनाए रखने और क्वेरी करने से बचती है या बाल्टी सामग्री को प्रमाणित करने और प्राप्त करने के लिए दूरस्थ एपीआई कॉल की एक श्रृंखला बनाती है।

आप उपयोगकर्ताओं को एफ़टीपी या एचटीटीपी के माध्यम से सीधे अपने सर्वर पर फ़ाइलों को अपलोड करने की अनुमति दे सकते हैं और फिर किसी भी आकार के साथ फ़ाइलों के लिए निर्देशिकाओं पर पुनरावृत्ति करके चरम समय पर अमेज़ॅन के लिए नई और अद्यतन फ़ाइलों के एक बैच को स्थानांतरित कर सकते हैं। अमेज़न पर एक फ़ाइल स्थानांतरण के पूरा होने पर, वेब सर्वर फ़ाइल को उसी नाम के रिक्त स्थान से बदलें। यदि किसी स्थानीय फ़ाइल में कोई फ़ाइल है तो सीधे उसकी सेवा करें क्योंकि इसकी प्रतीक्षा बैच हस्तांतरण है।


एक EXTFS2 / 3 डिस्क पर अपने नोड भंडारण स्थान को विस्फोट करने का शानदार तरीका है यदि आपके पास अपने S3 बाल्टी में लाखों फाइलें हैं ...
tpartee

1

जिस तरह से मैंने ऐसा किया है: मेरे पास s3 में हजारों फाइलें हैं। मैंने सूची में एक फ़ाइल के गुण पैनल को देखा। आप उस फ़ाइल का यूआरआई देख सकते हैं और मैंने उस कॉपी को ब्राउज़र में पेस्ट कर दिया है - यह एक टेक्स्ट फाइल थी और इसे अच्छी तरह से प्रस्तुत किया गया था। अब मैंने uuid को url में उस uuid के साथ बदल दिया जो मेरे हाथ में था और वहाँ फ़ाइल बूम है।

काश AWS के पास एक फ़ाइल खोजने का एक बेहतर तरीका होता, लेकिन यह मेरे लिए काम करता है।


1

इस आदेश का प्रयास करें:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

फिर आप इसे विशिष्ट फ़ाइल प्रकारों को प्राप्त करने के लिए एक grep में पाइप कर सकते हैं।


1
नोट: --output textनिर्दिष्ट करता है कि आउटपुट प्लेन टेक्स्ट होगा, न कि JSON, आदि और --query 'Contents[].{Key: Key, Size: Size}'केवल नाम और फ़ाइल का आकार दर्ज करने के लिए सूची के आउटपुट को फ़िल्टर करता है। यह खोज Key: Keyया पसंद नहीं करता है ।
मैट

1

मैंने निम्नलिखित तरीके से कोशिश की

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

यह वास्तविक पथ को आउटपुट करता है जहाँ फ़ाइल मौजूद है

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv

1

यह छोटा सा पुराना धागा है - लेकिन शायद किसी ऐसे व्यक्ति की मदद करें जो अभी भी खोज करता है - मैं वह हूं जो एक वर्ष के लिए खोज करता हूं।

समाधान " AWS एथेना " हो सकता है जहां आप इस तरह से डेटा खोज सकते हैं

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

वर्तमान में मूल्य निर्धारण 1TB डेटा के लिए $ 5 है - इसलिए, उदाहरण के लिए, यदि आपकी क्वेरी 1TB फ़ाइल 3times पर खोज करती है, तो आपकी लागत $ 15 है - लेकिन उदाहरण के लिए यदि "कनवर्ट किए गए स्तंभ स्वरूप" में केवल 1column है, तो आप क्या पढ़ना चाहते हैं, आप 1 भुगतान करेंगे / 3 की कीमत का मतलब $ 1.67 / टीबी है।


किसी भी आवेदन के लिए संभव नहीं लगता है कि गहन खोज की आवश्यकता होती है, हालांकि लागत काफी अधिक होती है ...
tnkh

@tnkh मैं सहमत हूँ - मुझे # s3 के साथ भी अधिक विकल्प चाहिए
BG Bruno


0

मैंने अपनी बाल्टी में पैटर्न खोजने के लिए नीचे कुछ किया

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

बड़ी बाल्टियों के लिए यह बहुत अधिक समय लेता है क्योंकि सभी ऑब्जेक्ट सारांश एव्स द्वारा वापस कर दिए जाते हैं और न केवल उन लोगों को जो उपसर्ग और सीमांकक से मेल खाते हैं। मैं प्रदर्शन को बेहतर बनाने के तरीकों की तलाश कर रहा हूं और अब तक मैंने केवल यही पाया है कि मुझे चाबियों का नाम देना चाहिए और उन्हें बाल्टियों में ठीक से व्यवस्थित करना चाहिए।


0

मैंने उसी समस्या का सामना किया। वर्तमान स्थिति की तुलना में S3 में खोज करना अधिक आसान होना चाहिए। इसीलिए, मैंने S3 में खोज के लिए इस ओपन सोर्स टूल को लागू किया।

SSEARCH पूर्ण खुला स्रोत S3 खोज उपकरण है। यह हमेशा ध्यान में रखते हुए लागू किया गया है कि प्रदर्शन महत्वपूर्ण कारक है और बेंचमार्क के अनुसार यह बाल्टी की खोज करता है जिसमें सेकंड के भीतर ~ 1000 फाइलें होती हैं।

स्थापना सरल है। आप केवल docker-compose फ़ाइल डाउनलोड करते हैं और उसके साथ चल रहे हैं

docker-compose up

SSEARCH शुरू किया जाएगा और आप अपने पास मौजूद किसी भी बाल्टी में कुछ भी खोज सकते हैं।


0

2020 के लिए तेजी से आगे, और हमारे 2fa के रूप में aws-okta का उपयोग करते हुए, निम्न कमांड, जबकि इस विशेष बाल्टी (+270,000) में सभी वस्तुओं और फ़ोल्डरों के माध्यम से पुनरावृति करने के लिए नरक के रूप में धीमी गति से काम किया।

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt

0

S3 बाल्टी को क्वेरी करने के लिए Amazon Athena का उपयोग करें। इसके अलावा, डेटा को Amazon Elastic खोज में लोड करें। उम्मीद है की यह मदद करेगा।


0

तकनीकी उत्तर नहीं, लेकिन मैंने एक एप्लिकेशन बनाया है जो वाइल्डकार्ड खोज के लिए अनुमति देता है: https://bucketsearch.net/

यह अतुल्यकालिक रूप से आपकी बाल्टी को अनुक्रमणित करेगा और फिर आपको परिणामों को खोजने की अनुमति देगा।

यह उपयोग करने के लिए स्वतंत्र है (दान)।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.