Model Context Protocol (MCP) untuk Browser Automation: Mengoptimalkan Interaksi Cerdas

Dalam lanskap pengembangan web yang terus berubah, browser automation telah menjadi tulang punggung banyak operasi, mulai dari pengujian end-to-end, web scraping, hingga otomatisasi tugas-tugas repetitif. Namun, seiring dengan meningkatnya kompleksitas aplikasi web dan integrasi AI, tantangan terbesar adalah bagaimana memastikan agen otomatisasi kita “memahami” konteks halaman dengan benar dan bereaksi secara cerdas. Di sinilah konsep Model Context Protocol (MCP) menawarkan pendekatan baru yang revolusioner.

Saya sering melihat developer kesulitan dengan script otomatisasi yang rapuh. Sedikit perubahan pada struktur DOM atau urutan interaksi bisa langsung membuat script crash. Ini karena script tradisional seringkali hanya melihat elemen secara individual, bukan sebagai bagian dari sebuah “model” atau “konteks” yang lebih besar. MCP hadir sebagai sebuah filosofi dan arsitektur untuk membangun sistem otomatisasi yang lebih tangguh, adaptif, dan cerdas, terutama saat berinteraksi dengan model AI.

Artikel ini akan membahas secara mendalam apa itu MCP dalam konteks browser automation, mengapa ini menjadi kunci untuk masa depan otomatisasi yang digerakkan AI, komponen-komponennya, serta bagaimana Anda bisa mulai mengintegrasikannya ke dalam workflow Anda. Jika Anda seorang developer yang ingin membawa otomatisasi browser ke level berikutnya, memahami MCP adalah langkah penting.

Daftar Isi sembunyikan

Apa Itu Model Context Protocol (MCP) dalam Browser Automation?

Secara sederhana, Model Context Protocol (MCP) adalah sebuah kerangka kerja konseptual yang mengatur bagaimana informasi kontekstual tentang keadaan sebuah halaman web (atau aplikasi web) dimodelkan, diekstraksi, dan dikomunikasikan antara berbagai komponen dalam sistem otomatisasi browser. Ini bukan sebuah standar resmi yang dipublikasikan oleh W3C, melainkan sebuah pendekatan arsitektural yang semakin relevan dengan munculnya AI dalam otomatisasi.

Mari kita pecah maknanya:

1. Model (State Model)

Dalam konteks ini, “Model” merujuk pada representasi terstruktur dari keadaan suatu halaman web pada waktu tertentu. Ini bukan sekadar DOM tree mentah, melainkan sebuah abstraksi yang lebih tinggi dan bermakna. Model ini bisa mencakup:

  • UI Component Model: Representasi komponen-komponen UI (tombol, input field, dropdown, tabel) beserta atribut-atribut pentingnya (teks, status aktif/nonaktif, nilai, posisi).
  • Data Model: Data yang ditampilkan atau diekstrak dari halaman, mungkin dalam format JSON atau struktur data lainnya yang lebih mudah diproses.
  • Intent Model: Jika ada elemen AI, model ini bisa mencakup perkiraan tujuan pengguna, aksi yang diharapkan, atau bahkan anomali yang terdeteksi di halaman.
  • Navigation Model: Struktur halaman yang terlihat dan potensial untuk dinavigasi (misalnya, link ke halaman berikutnya, item menu).

Model ini bersifat dinamis, diperbarui setiap kali ada perubahan signifikan pada halaman atau interaksi yang terjadi.

2. Context (Situational Awareness)

“Context” adalah informasi menyeluruh yang memberikan pemahaman tentang situasi saat ini. Ini melampaui sekadar model halaman. Konteks bisa meliputi:

  • History of Interactions: Urutan aksi yang telah dilakukan oleh agen otomatisasi atau pengguna (klik, input teks, scroll).
  • Goal/Objective: Tujuan utama dari sesi otomatisasi saat ini (misalnya, “beli produk X,” “ekstrak data harga,” “validasi form registrasi”).
  • Environmental Factors: Ukuran layar, browser yang digunakan, koneksi internet, hingga waktu dalam sehari.
  • User State: Apakah pengguna sudah login, peran pengguna, preferensi yang tersimpan.

Menggabungkan model dengan konteks memberikan agen otomatisasi pandangan yang lebih holistik dan kaya informasi.

3. Protocol (Communication & Exchange)

“Protocol” adalah seperangkat aturan dan format standar untuk bagaimana Model dan Context ini dibuat, dipertahankan, dan dipertukarkan antara agen otomatisasi (misalnya, script Python, AI agent) dan browser itu sendiri atau bahkan komponen AI yang berbeda. Ini bisa berupa:

  • API Specification: Endpoint dan format data untuk meminta model atau mengirimkan aksi.
  • Message Bus/Queue: Mekanisme untuk mempublikasikan pembaruan konteks dan mengonsumsi instruksi.
  • Structured Data Formats: Penggunaan JSON Schema, Protobuf, atau format lain untuk menjamin konsistensi data.
  • Event-driven Architecture: Sistem bereaksi terhadap peristiwa perubahan konteks.

Dengan MCP, otomatisasi tidak lagi hanya “melihat” elemen, tetapi “memahami” situasinya, memungkinkan pengambilan keputusan yang lebih cerdas dan adaptif.

Kenapa MCP Penting untuk Browser Automation Modern?

Pengembangan web modern dengan SPA (Single Page Application), dynamic content, dan personalisasi membuat otomatisasi tradisional berbasis selector statis menjadi sangat rapuh. MCP menawarkan solusi untuk tantangan ini, terutama dalam era AI:

1. Robustness dan Adaptabilitas

Script otomatisasi konvensional mudah rusak karena perubahan UI kecil. Dengan MCP, script berinteraksi dengan model abstraksi, bukan langsung dengan DOM mentah. Jika ID elemen berubah, selama makna dan fungsionalitasnya dalam model tetap sama, script tidak perlu diubah. Ini membuat otomatisasi lebih adaptif terhadap perubahan frontend.

2. Integrasi AI yang Mulus

Ini adalah area di mana MCP bersinar paling terang. Model AI (seperti Large Language Models) jauh lebih efektif ketika diberikan konteks yang kaya dan terstruktur. Daripada memberikan “screenshot” atau “DOM mentah” yang sulit diinterpretasi, MCP menyediakan representasi semantik dari halaman yang mudah diproses AI. AI bisa lebih akurat dalam:

  • Menentukan aksi berikutnya: Berdasarkan tujuan dan model halaman, AI bisa memutuskan apa yang harus diklik atau diisi.
  • Mengekstrak informasi: AI bisa mengidentifikasi data penting dari model, bahkan jika strukturnya sedikit berubah.
  • Self-healing: Jika sebuah elemen tidak ditemukan dengan selector lama, AI bisa mencoba mencari alternatif berdasarkan atribut dan konteks di model.

3. Pemahaman Konteks yang Lebih Dalam

MCP memungkinkan otomatisasi tidak hanya tahu “apa yang ada di layar” tetapi juga “apa artinya itu.” Misalnya, sebuah elemen <div class="price">Rp 50.000</div> bagi script tradisional hanyalah sebuah div. Bagi sistem berbasis MCP, itu adalah “harga produk”, sebuah entitas dengan nilai numerik, mata uang, dan relevansi terhadap konteks produk yang sedang dilihat.

4. Pengujian End-to-End yang Lebih Cerdas

Dalam pengujian, MCP bisa membantu menciptakan skenario yang lebih realistis dan adaptif. Tes bisa memverifikasi “apakah data yang benar ditampilkan di area harga” daripada “apakah elemen dengan ID ‘product-price’ memiliki teks ‘Rp 50.000′”. Ini membuat tes lebih tahan terhadap refactoring UI.

5. Kolaborasi dan Modularitas

Dengan protokol yang jelas, berbagai tim atau komponen bisa bekerja pada bagian otomatisasi yang berbeda tanpa saling bergantung pada detail implementasi UI yang spesifik. Modul untuk ekstraksi data bisa fokus pada model data, sementara modul interaksi fokus pada model UI.

Komponen Utama dalam Implementasi MCP

Untuk mengimplementasikan MCP, beberapa komponen inti perlu ada dalam arsitektur sistem otomatisasi Anda:

1. Context Extractor (Browser Agent)

Ini adalah komponen yang berjalan di dalam atau berinteraksi erat dengan browser. Tugasnya adalah mengamati DOM, mendeteksi perubahan, dan menerjemahkan keadaan mentah halaman menjadi representasi “Model” yang terstruktur. Alat seperti Puppeteer, Playwright, atau Selenium bisa digunakan untuk ini, tetapi dengan lapisan abstraksi tambahan. Extractor ini akan:

  • Mengidentifikasi elemen-elemen UI kunci (input, tombol, tautan, teks).
  • Mengekstrak atribut relevan dari elemen tersebut (ID, kelas, teks, nilai, href, status).
  • Membangun struktur data (misalnya JSON) yang merepresentasikan hierarki dan relasi elemen-elemen ini.
  • Mendeteksi perubahan pada DOM dan memperbarui model secara inkremental atau penuh.

2. Context Modeler

Komponen ini mengambil output dari Context Extractor dan menyempurnakannya menjadi “Model” yang lebih semantik dan bermakna. Ini bisa melibatkan:

  • Semantic Mapping: Memetakan elemen generik ke entitas domain (misalnya, <input type="text" id="username"> menjadi “field login username”).
  • Relation Graph: Membangun grafik hubungan antar elemen (misalnya, “tombol ‘Tambah ke Keranjang’ terkait dengan ‘Nama Produk’ ini dan ‘Harga’ ini”).
  • State Aggregation: Menggabungkan informasi dari berbagai sumber (DOM, Local Storage, cookies) untuk membentuk konteks yang komprehensif.

3. Context Protocol & Communication Layer

Ini adalah infrastruktur yang memungkinkan pertukaran Model dan Context. Bisa berupa:

  • RESTful API: Agen otomatisasi bisa meminta model dari browser agent melalui HTTP.
  • WebSocket: Untuk komunikasi real-time, di mana browser agent bisa “mendorong” pembaruan model ke agen otomatisasi.
  • Message Queue (Kafka, RabbitMQ): Untuk sistem terdistribusi, di mana pembaruan konteks dipublikasikan sebagai event.
  • Shared Memory/Database: Dalam arsitektur monolitik.

Protokol ini juga mendefinisikan format pesan (misalnya, JSON Schema untuk model, definisi aksi yang dapat diterima).

4. Automation Agent (Consumer)

Ini adalah “otak” otomatisasi yang menerima Model dan Context, mengambil keputusan, dan mengirimkan aksi kembali ke browser. Agen ini bisa berupa:

  • Rule-based Engine: Mesin yang mengikuti aturan-aturan yang telah ditentukan sebelumnya (misalnya, “jika ada tombol ‘Lanjutkan Pembayaran’ dan harga total kurang dari X, klik tombol tersebut”).
  • AI Agent (LLM): Model bahasa besar yang menginterpretasikan konteks dan menghasilkan instruksi (misalnya, “klik tombol yang paling mirip dengan ‘Checkout'”).
  • Human-in-the-Loop Interface: Di mana manusia mengawasi dan mengintervensi berdasarkan konteks yang disajikan.

Contoh Penerapan MCP dalam Berbagai Skenario

Mari kita lihat bagaimana MCP bisa diaplikasikan dalam skenario nyata:

1. AI-Driven Browser Automation

Bayangkan Anda ingin LLM mengelola workflow e-commerce. Tanpa MCP, Anda mungkin memberi LLM screenshot atau HTML mentah, lalu memintanya “klik tombol checkout.” Ini tidak efisien dan sering gagal.

Dengan MCP:

  • Context Extractor menghasilkan model JSON dari halaman belanja: daftar produk, harga, tombol “Tambah ke Keranjang”, form kupon, tombol “Checkout”.
  • Model ini, beserta riwayat interaksi dan tujuan pengguna (misalnya, “beli iPhone terbaru”), dikirim ke LLM melalui protokol.
  • LLM menerima model ini, memahami bahwa “tombol checkout” adalah elemen dengan ID ‘btn-checkout’ atau teks ‘Lanjutkan Pembayaran’ dalam model.
  • LLM merespons dengan instruksi terstruktur: {"action": "click", "element_id": "btn-checkout", "semantic_label": "checkout_button"}.
  • Browser Agent menerima instruksi ini dan melakukan aksi yang relevan, bahkan jika ID tombol berubah, selama semantic label-nya tetap terdeteksi oleh Context Extractor.

2. Complex Data Scraping dengan Adaptasi

Anda perlu mengekstrak data dari website berita yang sering mengubah tata letaknya. Script tradisional Anda akan sering rusak.

Dengan MCP:

  • Context Extractor dan Modeler membangun “model artikel” yang berisi judul, penulis, tanggal, dan isi, terlepas dari struktur HTML spesifiknya.
  • Model ini dikirim ke scraper utama.
  • Jika ada perubahan tata letak, Extractor/Modeler mungkin perlu sedikit penyesuaian, tetapi scraper utama yang mengonsumsi “model artikel” tidak terpengaruh.
  • Bahkan bisa ada AI kecil yang memantau perubahan layout dan secara otomatis mencoba memperbarui semantic mapping dalam modeler.

3. Self-Healing Automation Scripts

Dalam pengujian UI, salah satu tantangan adalah script yang rapuh. Jika sebuah tombol pindah posisi atau ID-nya berubah, tes akan gagal.

Dengan MCP:

  • Tes mendefinisikan interaksi pada level “model” (misalnya, “klik tombol untuk membuka modal pengaturan”).
  • Jika Context Extractor mendeteksi bahwa elemen dengan ID lama tidak ada, ia dapat menggunakan informasi kontekstual lain (misalnya, teks tombol, area sekitarnya, jenis elemen) untuk mencoba menemukan elemen yang secara semantik paling mirip.
  • Informasi ini kemudian digunakan untuk memperbarui model dan script bisa melanjutkan eksekusi, atau setidaknya memberikan laporan yang lebih informatif tentang mengapa sebuah elemen tidak ditemukan.

Tantangan Implementasi MCP

Meskipun menjanjikan, MCP juga memiliki tantangannya:

  • Kompleksitas Awal: Membangun Context Extractor dan Modeler yang robust memerlukan investasi waktu dan keahlian yang signifikan. Ini lebih dari sekadar menulis selector CSS.
  • Overhead Performa: Proses ekstraksi, pemodelan, dan pertukaran konteks bisa menambah overhead, terutama pada aplikasi web yang sangat dinamis atau pada volume otomatisasi yang tinggi.
  • Standarisasi Model: Menentukan format “Model” yang universal dan bermakna untuk semua jenis halaman bisa sangat sulit. Ini seringkali harus disesuaikan per domain atau jenis aplikasi.
  • Maintenance Extractor/Modeler: Meskipun agen otomatisasi menjadi lebih stabil, Context Extractor dan Modeler itu sendiri perlu di-maintain jika ada perubahan fundamental pada website yang diotomatisasi.
  • Kebutuhan Komputasi untuk AI: Jika AI Agent digunakan, kebutuhan komputasi untuk memproses model kontekstual bisa sangat tinggi.

Praktik Terbaik (Best Practices) untuk Mendesain MCP Anda

Jika Anda tertarik untuk mengimplementasikan MCP, berikut adalah beberapa praktik terbaik:

  • Mulai dari yang Sederhana: Jangan mencoba membuat model yang sempurna untuk semua hal sekaligus. Mulailah dengan memodelkan bagian-bagian kritis dari alur kerja Anda.
  • Definisikan Schema Model yang Jelas: Gunakan JSON Schema atau alat serupa untuk mendefinisikan struktur model Anda. Ini membantu konsistensi dan validasi.
  • Prioritaskan Semantic Labeling: Daripada bergantung pada ID atau class, usahakan untuk memberikan label semantik pada elemen dalam model Anda (misalnya, “search_input”, “submit_button_login”, “product_price”).
  • Gunakan Event-Driven Architecture: Untuk komunikasi antar komponen, event-driven approach (misalnya, browser agent mempublikasikan “PAGE_CONTEXT_UPDATED” event) dapat membuat sistem lebih responsif.
  • Iterasi dan Uji Coba: Desain dan implementasi MCP adalah proses iteratif. Uji model Anda secara ekstensif dengan berbagai skenario dan perubahan UI.
  • Pertimbangkan Tingkat Abstraksi: Seberapa detail model Anda? Terlalu detail bisa jadi verbose, terlalu umum bisa kehilangan informasi penting. Temukan keseimbangan yang tepat untuk kebutuhan Anda.
  • Monitor Performa: Pantau overhead yang ditimbulkan oleh ekstraksi dan pemodelan konteks. Optimalkan jika menjadi bottleneck.

Masalah yang Sering Terjadi

Saat mencoba mengelola konteks dalam otomatisasi browser, beberapa masalah umum sering muncul:

1. Model Tidak Akurat atau Outdated

Gejala: Agen otomatisasi mengambil keputusan yang salah atau mencoba berinteraksi dengan elemen yang tidak ada/tidak relevan.
Penyebab: Context Extractor tidak mendeteksi semua perubahan DOM, model terlalu statis, atau ada delay dalam pembaruan konteks.
Solusi: Pastikan Context Extractor memiliki mekanisme deteksi perubahan DOM yang robust (misalnya, menggunakan MutationObserver atau polling yang cerdas). Terapkan pembaruan model secara asinkron dan pastikan agen otomatisasi selalu bekerja dengan versi model terbaru. Pertimbangkan cache invalidation yang tepat.

2. Terlalu Banyak Noise dalam Model

Gejala: Model menjadi terlalu besar, penuh dengan elemen atau data yang tidak relevan, mempersulit interpretasi oleh agen otomatisasi atau AI.
Penyebab: Context Extractor terlalu agresif dalam mengekstrak semua detail DOM tanpa filter semantik.
Solusi: Terapkan filter pada Context Extractor untuk hanya mengekstrak elemen yang relevan dengan tujuan otomatisasi. Gunakan Semantic Modeler untuk menyaring dan mengabstraksi informasi, hanya mempertahankan esensi yang diperlukan. Fokus pada “what matters” bukan “everything that exists.”

3. Performa Ekstraksi Konteks yang Lambat

Gejala: Otomatisasi terasa lambat, ada jeda signifikan antara perubahan halaman dan ketersediaan model konteks.
Penyebab: Proses traversi DOM yang mahal, perhitungan yang kompleks di Modeler, atau komunikasi antar komponen yang tidak efisien.
Solusi: Optimalkan Context Extractor dengan menargetkan area spesifik DOM. Gunakan teknik perubahan inkremental daripada membangun ulang model dari awal. Manfaatkan Web Workers (jika relevan) untuk memproses konteks di latar belakang. Optimalkan protokol komunikasi (misalnya, beralih ke WebSocket untuk real-time updates).

4. Kesulitan Menangani Dinamika UI yang Tinggi

Gejala: Model tidak bisa menangani elemen yang muncul/hilang dengan cepat, animasi kompleks, atau interaksi pengguna yang tidak standar.
Penyebab: Extractor tidak cukup cepat atau cerdas untuk melacak perubahan pada UI yang sangat dinamis.
Solusi: Implementasikan strategi “wait for condition” pada Extractor/Modeler sebelum membuat model akhir. Gunakan heuristic atau bahkan model machine learning ringan untuk mengidentifikasi elemen dinamis. Desain model untuk bisa mengakomodasi elemen opsional atau transien.

Pengalaman dan Pertimbangan Praktis

Dalam pengalaman saya membangun sistem otomatisasi, salah satu pelajaran terbesar adalah bahwa managing state atau konteks adalah bagian paling sulit namun paling krusial. Ketika saya mencoba mengintegrasikan LLM untuk tugas-tugas browser, memberikan raw DOM atau screenshot adalah resep untuk kegagalan.

Pendekatan yang mirip dengan MCP, meskipun belum tentu dinamai demikian, sangat membantu. Saya pernah membangun sebuah “DOM Observer” yang tidak hanya mengambil snapshot DOM, tetapi juga menganalisisnya, mengidentifikasi komponen-komponen penting, dan menyajikannya sebagai sebuah grafik berlabel semantik ke agen AI. Hasilnya, akurasi AI dalam memilih aksi yang benar meningkat drastis, dan script menjadi jauh lebih tahan terhadap perubahan minor pada UI.

Beberapa pertimbangan praktis yang saya temukan:

  • Trade-off Kompleksitas vs. Robustness: Semakin canggih MCP Anda, semakin kompleks pula implementasinya. Pada project skala kecil atau otomatisasi tugas sederhana, overhead MCP mungkin tidak sepadan. Namun, untuk sistem yang perlu bertahan lama, berinteraksi dengan AI, atau menghadapi UI yang sering berubah, investasi ini sangat berharga.
  • Resource yang Dibutuhkan: Mengimplementasikan Context Extractor yang cerdas bisa memakan resource CPU, terutama jika melibatkan analisis DOM yang dalam. Pertimbangkan untuk menjalankan Extractor di lingkungan yang terpisah atau memanfaatkan headless browser yang lebih ringan.
  • Keterbatasan Otomatisasi Web: Meskipun MCP meningkatkan kecerdasan, ia tidak menghilangkan batasan mendasar dari otomatisasi browser, seperti deteksi CAPTCHA, tantangan keamanan, atau keterbatasan akses ke API internal browser.
  • Peran Human-in-the-Loop: Untuk skenario yang sangat kompleks atau saat ada anomali, memiliki mekanisme di mana manusia dapat mengintervensi atau melatih ulang model berdasarkan konteks yang disajikan oleh MCP sangatlah penting.

Singkatnya, MCP adalah evolusi alami dalam otomatisasi browser, khususnya saat kita bergerak menuju era agen AI yang lebih otonom. Ini bukan hanya tentang membuat kode bekerja, tetapi tentang membuat kode “memahami.”

FAQ

Apakah MCP adalah standar yang diakui secara global?

Tidak, MCP bukan standar resmi seperti HTML atau CSS. Ini adalah kerangka kerja konseptual atau pendekatan arsitektural yang didorong oleh kebutuhan modern dalam otomatisasi browser, terutama dengan integrasi AI. Anda dapat mengimplementasikannya dengan cara Anda sendiri.

Apa bedanya MCP dengan Page Object Model (POM) tradisional?

Page Object Model (POM) berfokus pada enkapsulasi elemen dan interaksi pada halaman web untuk tujuan pengujian, seringkali menggunakan selector statis. MCP lebih luas, berfokus pada pemodelan semantik seluruh konteks halaman dan mekanisme protokol untuk pertukaran model tersebut, menjadikannya lebih adaptif dan cocok untuk AI-driven automation daripada sekadar pengujian.

Bisakah saya mengimplementasikan MCP tanpa menggunakan AI?

Tentu saja. Meskipun MCP sangat kuat untuk integrasi AI, manfaat seperti robustness, adaptabilitas terhadap perubahan UI, dan modularitas juga berlaku untuk otomatisasi berbasis aturan yang kompleks. Anda bisa menggunakan rule-based engine sebagai Automation Agent tanpa perlu LLM.

Apakah MCP hanya berlaku untuk browser automation?

Prinsip di balik MCP, yaitu pemodelan konteks dan protokol pertukaran, bisa diterapkan di berbagai domain otomatisasi lain (misalnya, desktop automation, API automation). Namun, artikel ini fokus pada penerapannya dalam browser automation karena kompleksitas UI dan interaksinya yang unik.

Framework atau library apa yang bisa digunakan untuk membangun MCP?

Anda bisa menggunakan Playwright atau Puppeteer sebagai dasar untuk Context Extractor. Untuk pemodelan, Anda mungkin perlu membuat custom logic dengan bahasa pilihan Anda (Python, JavaScript). Untuk protokol, teknologi seperti WebSocket, REST API, atau Message Queue bisa digunakan tergantung arsitektur Anda.

Kesimpulan

Model Context Protocol (MCP) adalah fondasi arsitektural yang kritis untuk masa depan browser automation, terutama dengan percepatan adopsi AI. Dengan secara eksplisit memodelkan keadaan dan konteks sebuah halaman web, kita tidak hanya membuat otomatisasi yang lebih tangguh dan adaptif, tetapi juga membuka pintu bagi agen AI untuk berinteraksi dengan web pada tingkat pemahaman yang jauh lebih dalam.

Meskipun implementasinya memerlukan investasi awal dalam desain dan pengembangan, manfaat jangka panjang dalam hal efisiensi, akurasi, dan kemampuan beradaptasi akan jauh melampaui biayanya. Bagi setiap developer yang serius ingin membangun solusi otomatisasi yang cerdas dan modern, memahami dan mengadopsi prinsip-prinsip MCP adalah langkah strategis yang tidak bisa diabaikan.

TAGS: Browser Automation, AI Automation, Model Context Protocol, MCP, Web Scraping, End-to-End Testing, AI for Developers, Developer Tools, Smart Automation, Context Management


Baca Juga

You May Also Like

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *