> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# LaunchLab talimatları

> Initialize, Buy, Sell, Graduate, CollectFees, SetParams — her LaunchLab talimatı için argüman şekilleri, hesap listeleri ve ön/sonkoşullar.

<Info>
  **Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.**

  [İngilizce sürümü görüntüle →](/products/launchlab/instructions)
</Info>

<Info>
  LaunchLab dar bir talimat setini sunar: altı kullanıcı taraflı çağrı ve bir avuç yönetici primitifi. SDK hepsini sarmalamaktadır; bu sayfa, aggregatör, izleme araçları ve CPI gerektiren programlar için ham arayüzü belgelemektedir.
</Info>

## Talimat envanteri

| Grup                    | Talimat                                                    | Çağrılabilir kaynaklar                                                                                                                                                                   |
| ----------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Küresel yapılandırma    | `CreateConfig` / `UpdateConfig`                            | Yönetici                                                                                                                                                                                 |
| Başlatma yaşam döngüsü  | `Initialize` / `InitializeV2`                              | Herkes (oluşturucu) — SPL Token başlatmaları; V2, `amm_creator_fee_on` öğesini sonraki CPMM mezuniyet için kaydeder                                                                      |
| Başlatma yaşam döngüsü  | `InitializeWithToken2022`                                  | Herkes (oluşturucu) — Token-2022 başlatması, isteğe bağlı `TransferFeeConfig`                                                                                                            |
| İşlem                   | `BuyExactIn` / `BuyExactOut`                               | Herkes — bağlama eğrisi üzerinde tam-giriş / tam-çıkış alışveriş                                                                                                                         |
| İşlem                   | `SellExactIn` / `SellExactOut`                             | Herkes — bağlama eğrisi üzerinde tam-giriş / tam-çıkış satış                                                                                                                             |
| Mezuniyet               | `MigrateToAmm`                                             | Göç cüzdanı (`GlobalConfig`'te ayarlanan) — AMM v4'e mezun ol. `amm_creator_fee_on = BothToken` olduğunda kullanılır, böylece yaratıcı ücreti her iki taraftan da tahsil edilebilir.     |
| Mezuniyet               | `MigrateToCpswap`                                          | Göç cüzdanı — CPMM'ye mezun ol. `amm_creator_fee_on = QuoteToken` olduğunda kullanılır ve Token-2022 başlatmaları için gereklidir. CPMM'de `InitializeWithPermission`'ı sarmalamaktadır. |
| Ücretler                | `CollectFee`                                               | Yönetici — bir başlatmadan protokol ücretlerini temizle                                                                                                                                  |
| Ücretler                | `CollectMigrateFee`                                        | Yönetici — biriken göç ücretlerini temizle                                                                                                                                               |
| Ücretler                | `ClaimCreatorFee`                                          | Oluşturucu — eğri aşaması sırasında biriken yaratıcı ücretlerini talep et                                                                                                                |
| Vesting                 | `CreateVestingAccount`                                     | Oluşturucu — kilitli belirteçleri bir lehtar için ayır, mezuniyet sonrasında kilidi açılır                                                                                               |
| Vesting                 | `CreatePlatformVestingAccount`                             | Platform yöneticisi — kilitli belirteçleri platform taraflı lehtarlar için ayır                                                                                                          |
| Vesting                 | `ClaimVestedToken`                                         | Lehtar — resepsiyon sonrasında kilidi açılmış belirteçleri talep et                                                                                                                      |
| Platform yapılandırması | `CreatePlatformConfig` / `UpdatePlatformConfig`            | Platform yöneticisi                                                                                                                                                                      |
| Platform yapılandırması | `UpdatePlatformCurveParam` / `RemovePlatformCurveParam`    | Platform yöneticisi — platform başına izin verilen eğri şekillerinin listesini yönetin                                                                                                   |
| Platform ücretleri      | `ClaimPlatformFee` / `ClaimPlatformFeeFromVault`           | Platform yöneticisi                                                                                                                                                                      |
| Platform erişimi        | `CreatePlatformGlobalAccess` / `ClosePlatformGlobalAccess` | Yönetici — belirli bir `GlobalConfig`'in hangi platformlar tarafından kullanılabileceğini belirle                                                                                        |

"ExactIn/ExactOut" bölünmesi CPMM'nin `SwapBaseInput` / `SwapBaseOutput` öğesini yansıtır — zincir üzerinde bunlar, hafifçe farklı yuvarlama ile ayrı talimat ayırıcılarıdır.

**Mezuniyet yolunun seçimi.** `migrate_type`, `Initialize{V2,WithToken2022}` zamanında `PoolState`'te kaydedilir ve iki mezuniyet talimatından hangisinin çalışabileceğini belirler. Token-2022 başlatmaları her zaman CPMM'ye geçiş yapır. SPL Token başlatmaları, `amm_creator_fee_on` ayarına bağlı olarak AMM v4 veya CPMM'ye geçiş yapır:

* `BothToken` → `MigrateToAmm` → AMM v4 havuzu (yaratıcı ücreti her iki taraftan tahsil edilebilir; AMM v4'ün yerel bir yaratıcı-ücret alanı yoktur, bu nedenle yaratıcı ücretleri bunun yerine LP-kilit NFT mekanizması aracılığıyla alınır).
* `QuoteToken` → `MigrateToCpswap` → `creator_fee_on = OnlyQuoteToken` ile CPMM havuzu (yaratıcı LaunchLab Ücret Anahtarı NFT'si aracılığıyla CPMM havuzundan ücret almaya devam eder — [`products/launchlab/creator-fees`](/tr/products/launchlab/creator-fees) adresine bakın).

<Tip>
  **`AmmCreatorFeeOn` enum adı hakkında not.** Rust kaynağı bu enum'u `AmmCreatorFeeOn` olarak adlandırır ve `QuoteToken` ile `BothToken` varyantlarına sahiptir. Ad yanıltıcıdır: mevcut operasyonel uygulamada, varyant sadece yaratıcı ücreti hangi taraftan mezuniyet sonrası CPMM havuzunda tahsil edildiğini kontrol etmekle kalmaz — aynı zamanda mezuniyet **hedef programını** (AMM v4 vs CPMM) seçer ve başlatmanın `PoolState`'tindeki `migrate_type` ile eşleşir. Alanı "göç hedefi + mezuniyet sonrası yaratıcı-ücret tarafı" olarak birleştirilmiş olarak düşünün. Zincir üzerindeki enum adı yeniden düzenlenmiştir, ancak `MigrationTarget` olarak akıl yürütmek gerçeğe daha yakından uyar.
</Tip>

## `Initialize`

Yeni bir başlatma oluşturun.

**Argümanlar**

```
launch_params: {
    curve_type:                 u8,
    base_supply_max:            u64,
    base_supply_graduation:     u64,
    k:                          u128,              // veya curve_type=1 için initial_virtual_quote_reserve
    open_time:                  u64,
    quote_mint:                 Pubkey,
    base_token_metadata: {                         // satır içi ad/sembol/uri; program Metaplex'e CPI yapar
        name:   String,
        symbol: String,
        uri:    String,
    },
    fees: {
        buy_numerator:   u64,
        buy_denominator: u64,
        sell_numerator:  u64,
        sell_denominator: u64,
        lp_share:        u64,
        creator_share:   u64,
        protocol_share:  u64,
        total_share:     u64,
    },
    post_graduation_lp_policy:  u8,                // 0 = Burn, 1 = Lock, 2 = ToCreator
}
```

**Hesaplar** (kısaltılmış)

| #  | Ad                 | W | S | Notlar                                              |
| -- | ------------------ | - | - | --------------------------------------------------- |
| 1  | `creator`          | W | S | Kira + temel mint oluşturmayı öder.                 |
| 2  | `launch_config`    |   |   | Protokol yapılandırması bağlaması.                  |
| 3  | `launch_state`     | W |   | Yeni hesap.                                         |
| 4  | `launch_authority` |   |   | PDA.                                                |
| 5  | `base_mint`        | W | S | Taze Keypair (veya PDA) — bu talimat bunu başlatır. |
| 6  | `base_vault`       | W |   | `launch_authority`'nin `base_mint`'teki ATA'sı.     |
| 7  | `quote_mint`       |   |   |                                                     |
| 8  | `quote_vault`      | W |   | `launch_authority`'nin `quote_mint`'teki ATA'sı.    |
| 9  | `metadata`         | W |   | Metaplex metadata PDA.                              |
| 10 | `metaplex_program` |   |   |                                                     |
| 11 | `token_program`    |   |   | Yalnızca SPL Token.                                 |
| 12 | `system_program`   |   |   |                                                     |
| 13 | `rent`             |   |   |                                                     |

**Ön koşullar**

* `quote_mint ∈ launch_config.allowed_quote_mints`.
* `base_supply_graduation ≤ base_supply_max`.
* Ücret parametreleri `launch_config.max_*_fee_rate` kontrolleri geçer.
* `open_time ≥ now − slop` (SDK `≥ now` uygular; program hafif geriye dönük tarihlemeyi tolere eder).
* `curve_type` tanınmaktadır.

**Sonkoşullar**

* `base_mint` `supply = base_supply_max`'a sahiptir, hepsi `base_vault`'ta.
* `base_mint.mint_authority = launch_authority`, `freeze_authority = None`.
* `LaunchState` `status = Active`, `base_sold = 0`, `quote_reserve_real = 0` ile başlatılır.
* `quote_reserve_target` eğri parametrelerinden + `base_supply_graduation` + `buy_numerator` (yaklaşık olarak) hesaplanır.

**Yaygın hatalar** — `InvalidQuoteMint`, `FeeRateTooHigh`, `InvalidCurveParams`, `MathOverflow`.

## `Buy` (kanonik varyant: `BuyExactIn`)

Kullanıcı sabit bir `quote_in` sağlar; eğri `base_out`'u hesaplar.

**Argümanlar**

```
quote_in:          u64
minimum_base_out:  u64
```

**Hesaplar**

| #  | Ad                         | W | S |
| -- | -------------------------- | - | - |
| 1  | `user`                     | W | S |
| 2  | `launch_state`             | W |   |
| 3  | `launch_authority`         |   |   |
| 4  | `base_vault`               | W |   |
| 5  | `quote_vault`              | W |   |
| 6  | `user_base_ata`            | W |   |
| 7  | `user_quote_ata`           | W |   |
| 8  | `base_mint`                |   |   |
| 9  | `quote_mint`               |   |   |
| 10 | `token_program`            |   |   |
| 11 | `associated_token_program` |   |   |
| 12 | `system_program`           |   |   |

**Ön koşullar**

* `launch_state.status == Active`.
* `now ≥ open_time`.
* `user_quote_ata.balance ≥ quote_in`.
* `quote_in > 0`.

**Etki**

1. `quote_in`'i `quote_in_after_fee` ve ücret kısımlarına böl.
2. Post-ücret teklifi verilen `base_out` için eğriyi Newton-çöz.
3. `require(base_out ≥ minimum_base_out)` aksi halde `ExceededSlippage` ile geri dön.
4. `quote_in` kullanıcısını → kasaya taşı. `base_out` kasasını → kullanıcıya taşı.
5. `base_sold += base_out`, `quote_reserve_real += quote_in_after_fee × (lp_share / total_share)` güncelle.
6. Ücret sayaçlarını güncelle (`protocol_fees_quote`, `creator_fees_quote`).
7. `state_data.num_buys += 1`.
8. Güncellendikten sonra `quote_reserve_real ≥ quote_reserve_target` ise, SDK tipik olarak aynı işlemde bir `Graduate` ix zincirlemektedir. Program `Buy` içinde otomatik mezuniyet yapmaz — sonraki bir `Graduate` gereklidir.

## `BuyExactOut`

Kullanıcı tam `base_out`'u belirtir; program `quote_in`'i hesaplar.

**Argümanlar**

```
base_out:      u64
maximum_quote_in: u64
```

`BuyExactIn` ile aynı hesaplar. Newton iterasyonu yerine kapalı form ikinci dereceden integral (veya CPMM tersi, curve\_type 1 için) kullanır.

## `Sell` / `SellExactIn` / `SellExactOut`

`Buy`'ın aynalanması. Kullanıcı `base_in`'i eğriye geri döndürür ve `quote_out` alır. Ücret `quote_out`'dan düşülür, bu nedenle kullanıcı ham entegre gelirden daha az alır.

**Ön koşullar** —

* `user_base_ata.balance ≥ base_in`.
* Satış `base_sold`'u 0'ın altına itemiyor (muhasebe tutarlı olarak bu ile fazlalıklı).
* Başlatma `Active`'dir.

**Etki** — `Buy` ile simetrik. `base_sold` azalır, `quote_reserve_real` azalır. Ücretler yine de tahakkuk eder.

## `MigrateToAmm` / `MigrateToCpswap`

Eğri `total_quote_fund_raising`'e vurduktan sonra, bir başlatmayı ticari bir AMM havuzuna mezun edin. İki talimat, iki mezuniyet hedefine karşılık gelir — AMM v4 ve CPMM — ve **herhangi bir başlatma için bunlardan sadece biri geçerlidir**, `pool_state.migrate_type` tarafından belirlenmiştir (`Initialize` zamanında ayarlanan).

**Kim imzalar**

* `MigrateToAmm` — bağlama `GlobalConfig`'te kaydedilen `migrate_to_amm_wallet`.
* `MigrateToCpswap` — bağlama `GlobalConfig`'te kaydedilen `migrate_to_cpswap_wallet`.

Bu cüzdanlar tipik olarak Raydium tarafından işletilen mezuniyet krank tarafından tutulur; uygulamada mezuniyet, sonraki alışı tetikleyen ne olursa olsun, eşik aşıldıktan saniyeler sonra iner.

**Argümanlar**

`MigrateToAmm` üç tane alır (esas olarak programın AMM v4'e ilettiği OpenBook pazar parametreleri):

```
base_lot_size:               u64
quote_lot_size:              u64
market_vault_signer_nonce:   u8
```

`MigrateToCpswap` hiçbir şey almaz.

**Etki (her ikisi için ortak)**

1. `pool_state.status == Migrate`'i doğrulayın (yani, `quote_reserve_target` ulaşılmış). Aksi halde `PoolMigrated` (durum zaten `Migrated` oldu) veya `PoolFunding` (hala finansmandadır) ile geri dön.
2. `pool_state.migrate_type`'ın talimata uygun olduğunu doğrulayın (`0` AMM için, `1` CPMM için). Aksi halde `MigrateTypeNotMatch` ile geri dön.
3. Mezuniyet sonrası rezervleri hesaplayın:
   * `base_amount_out = base_vault.amount − vesting_schedule.total_locked_amount`
   * `quote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee`
4. Hedef programa CPI yap (`AMM v4 Initialize2` veya `CPMM InitializeWithPermission`) bu rezervlerle mezuniyet sonrası havuzunu oluşturmak.
5. Sonuçta ortaya çıkan LP'yi bağlama `PlatformConfig.{platform_scale, creator_scale, burn_scale}` (CPMM yalnız) — bir parça `platform_nft_wallet`'e basılmış, biri LP-Lock programı tarafından sarılmış bir yaratıcı NFT'ye, biri Burn & Earn aracılığıyla yakılmış. AMM v4 mezuniyeti için, LP düzeni AMM v4'ün kendi başlatma parametreleri tarafından yönetilir.
6. `base_mint.mint_authority`'yi iptal edin (sıfıra ayarlayın).
7. `pool_state.status = Migrated` ters çevir, `vesting_schedule.start_time = block_time + cliff_period` ayarlayın.

**Sonkoşullar** — `BuyExactIn`, `BuyExactOut`, `SellExactIn`, `SellExactOut` bu noktadan itibaren `PoolMigrated` ile red edecektir. Ortaya çıkan AMM havuzu kanonik ve diğer herhangi bir AMM v4 / CPMM havuzu gibi ticaret yapar.

**Yaygın hatalar** — `PoolFunding`, `PoolMigrated`, `MigrateTypeNotMatch`, `InvalidCpSwapConfig`, `MathOverflow`.

## `CollectFee`

Tek bir başlatmada protokolün biriken ticaret ücretlerinin yönetici temizliği.

**Argümanlar** — hiçbiri.

**Hesaplar**

| # | Ad                        | W | S | Notlar                                                      |
| - | ------------------------- | - | - | ----------------------------------------------------------- |
| 1 | `protocol_fee_owner`      |   | S | `global_config.protocol_fee_owner` değerine eşit olmalıdır. |
| 2 | `authority`               |   |   | PDA `[b"vault_auth_seed"]`; kasa transferini imzalar.       |
| 3 | `pool_state`              | W |   | `quote_protocol_fee`'yi sıfırlamak için mutasyon.           |
| 4 | `global_config`           |   |   | İmzalayanın gerçek kaynağı.                                 |
| 5 | `quote_vault`             | W |   | `quote_protocol_fee` tarafından boşaltılmıştır.             |
| 6 | `recipient_token_account` | W |   | `protocol_fee_owner`'ın `quote_mint`'teki ATA'sı.           |
| 7 | `quote_mint`              |   |   |                                                             |
| 8 | `token_program`           |   |   | SPL Token (teklif taraması her zaman SPL Token'dır).        |

**Etki** — `pool_state.quote_protocol_fee`'yi `quote_vault`'tan `recipient_token_account`'a aktar, sonra sayacı sıfırla. İlk alışveriş sonrasında istediğiniz zaman çağrılabilir.

## `CollectMigrateFee`

Mezuniyette biriken göç ücretinin yönetici temizliği. `CollectFee` ile aynı hesap şekli (`protocol_fee_owner` yerine imzalayanı `migrate_fee_owner` olarak) ve `pool_state.migrate_fee` drained sayacı.

## `ClaimCreatorFee`

Aynı teklif yalanını kullanan **sahip olduğu her başlatma** genelinde biriken yaratıcı ücretlerinin yaratıcı başına temizliği. Per-pool'u değil, per-creator ücret kasasını boşaltır.

**Argümanlar** — hiçbiri.

**Hesaplar**

| # | Ad                         | W | S | Notlar                                                           |
| - | -------------------------- | - | - | ---------------------------------------------------------------- |
| 1 | `creator`                  | W | S | Havuz yaratıcısı.                                                |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"creator_fee_vault_auth_seed"]`.                          |
| 3 | `creator_fee_vault`        | W |   | PDA'da `[creator, quote_mint]` tohumları; toplu yaratıcı kasası. |
| 4 | `recipient_token_account`  | W |   | `init_if_needed`; `creator`'ın `quote_mint`'teki ATA'sı.         |
| 5 | `quote_mint`               |   |   |                                                                  |
| 6 | `token_program`            |   |   |                                                                  |
| 7 | `system_program`           |   |   | Gerekirse ATA oluşturması için.                                  |
| 8 | `associated_token_program` |   |   |                                                                  |

**Etki** — `creator_fee_vault`'ın tüm bakiyesini `recipient_token_account`'a aktar. Kasa boşsa sıfırdan daha büyük kontrol ile geri dön.

## `ClaimPlatformFee`

Bir başlatmanın teklif kasasını doğrudan boşaltan platform başına temizlik. Bunu, bir platform toplanmış platform kasası aracılığıyla gitmeden belirli bir başlatma için dilimini talep etmek istediğinde kullanın.

**Argümanlar** — hiçbiri.

**Hesaplar**

| #  | Ad                         | W | S | Notlar                                                         |
| -- | -------------------------- | - | - | -------------------------------------------------------------- |
| 1  | `platform_fee_wallet`      | W | S | `platform_config.platform_fee_wallet` değerine eşit olmalıdır. |
| 2  | `authority`                |   |   | PDA `[b"vault_auth_seed"]`.                                    |
| 3  | `pool_state`               | W |   | `pool_state.platform_fee` tarafından boşaltılmıştır.           |
| 4  | `platform_config`          |   |   | İmzalayanın gerçek kaynağı.                                    |
| 5  | `quote_vault`              | W |   | Boşaltılmıştır.                                                |
| 6  | `recipient_token_account`  | W |   | `init_if_needed`; `platform_fee_wallet`'in ATA'sı.             |
| 7  | `quote_mint`               |   |   |                                                                |
| 8  | `token_program`            |   |   |                                                                |
| 9  | `system_program`           |   |   |                                                                |
| 10 | `associated_token_program` |   |   |                                                                |

**Etki** — `pool_state.platform_fee`'yi `quote_vault`'tan `recipient_token_account`'a aktar, sayacı sıfırla.

## `ClaimPlatformFeeFromVault`

Platform başına toplanmış temizlik. Platform aracılığıyla yönlendirilen her başlatmadan ücretleri biriktiren platform'un per-quote-mint ücret kasasını boşaltır.

**Argümanlar** — hiçbiri.

**Hesaplar**

| # | Ad                         | W | S | Notlar                                                         |
| - | -------------------------- | - | - | -------------------------------------------------------------- |
| 1 | `platform_fee_wallet`      | W | S | `platform_config.platform_fee_wallet` değerine eşit olmalıdır. |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"platform_fee_vault_auth_seed"]`.                       |
| 3 | `platform_config`          |   |   |                                                                |
| 4 | `platform_fee_vault`       | W |   | PDA'da `[platform_config, quote_mint]` tohumları.              |
| 5 | `recipient_token_account`  | W |   | `init_if_needed`; `platform_fee_wallet`'in ATA'sı.             |
| 6 | `quote_mint`               |   |   |                                                                |
| 7 | `token_program`            |   |   |                                                                |
| 8 | `system_program`           |   |   |                                                                |
| 9 | `associated_token_program` |   |   |                                                                |

**Etki** — `platform_fee_vault`'ın tüm bakiyesini `recipient_token_account`'a aktar. Kasa boşsa geri dön.

## Vesting ve platform-config talimatları

Bunlar, her biri kendi durum modeline sahip olduğu için ayrılmış sayfalarda belgelenmiştir:

* [`CreateVestingAccount`, `CreatePlatformVestingAccount`, `ClaimVestedToken`](/tr/products/launchlab/vesting)
* [`CreatePlatformConfig`, `UpdatePlatformConfig`, `UpdatePlatformCurveParam`, `RemovePlatformCurveParam`, `CreatePlatformGlobalAccess`, `ClosePlatformGlobalAccess`](/tr/products/launchlab/platform-config)
* [`CreateConfig`, `UpdateConfig`](/tr/products/launchlab/global-config)

## Durum değişim matrisi

| Talimat                                 | `status`   | `real_base` | `real_quote`     | Ücret sayaçları                                | Mezuniyet sonrası havuzu                         |
| --------------------------------------- | ---------- | ----------- | ---------------- | ---------------------------------------------- | ------------------------------------------------ |
| `Initialize{V2,WithToken2022}`          | Funding    | 0           | 0                | 0                                              | —                                                |
| `BuyExactIn(q_in)`                      | Funding    | +∆          | +∆q\_after\_fee  | `quote_protocol_fee += ∆`, `platform_fee += ∆` | —                                                |
| `SellExactIn(b_in)`                     | Funding    | −∆          | −∆q\_before\_fee | (aynı)                                         | —                                                |
| Eşik ulaşıldı                           | → Migrate  | —           | —                | —                                              | —                                                |
| `MigrateToAmm` / `MigrateToCpswap`      | → Migrated | (donmuş)    | (donmuş)         | `migrate_fee` set                              | oluşturulan, LP `PlatformConfig` başına bölünmüş |
| `CollectFee` / `CollectMigrateFee`      | herhangi   | —           | —                | sayaç sıfırlanmış                              | —                                                |
| `ClaimCreatorFee` / `ClaimPlatformFee*` | herhangi   | —           | —                | kasayı boşaltır                                | —                                                |
| `CreateVestingAccount`                  | Funding    | —           | —                | —                                              | `allocated_share_amount` bumps                   |
| `ClaimVestedToken`                      | Migrated   | —           | —                | —                                              | `base_vault` boşaltır                            |

## Sonraki nereye gitmeli

* [`products/launchlab/code-demos`](/tr/products/launchlab/code-demos) — her talimat için TypeScript örnekleri.
* [`products/launchlab/accounts`](/tr/products/launchlab/accounts) — tam durum şekli.
* [`reference/error-codes`](/tr/reference/error-codes) — LaunchLab hata enum'u.

Kaynaklar:

* [Raydium SDK v2 `LaunchLab` modülü](https://github.com/raydium-io/raydium-sdk-V2)
* Raydium LaunchLab program kaynağı
