% Explorer > EQCSgpWGX7SVc0GpmrCP4uQd685MHmPMnDn_HiaH7xCi90FI

Contract

AddressEQCSgpWGX7SVc0GpmrCP4uQd685MHmPMnDn_HiaH7xCi90FI
ChainBasic Workchain
Contract Type👍 Verfied source
Contract Code HashSt9IE1y1da267Udnmch/8pBCabH5Sa2k0EeekQS28hc=

verifier.ton.org verification

View code

Source Code

int op::transfer() asm "0xf8a7ea5 PUSHINT";
int op::transfer_notification() asm "0x7362d09c PUSHINT";
int op::internal_transfer() asm "0x178d4519 PUSHINT";
int op::excesses() asm "0xd53276db PUSHINT";
int op::burn() asm "0x595f07bc PUSHINT";
int op::burn_notification() asm "0x7bdd97de PUSHINT";

(int) equal_slices(slice s1, slice s2) asm "SDEQ";
builder store_coins(builder b, int x) asm "STGRAMS";
(slice, int) load_coins(slice s) asm( -> 1 0) "LDGRAMS";

int workchain() asm "0 PUSHINT";

() force_chain(slice addr) impure {
  (int wc, _) = parse_std_addr(addr);
  throw_unless(333, wc == workchain());
}

;; Minter
int op::mint() asm "21 PUSHINT";

cell pack_jetton_wallet_data(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
   return  begin_cell()
            .store_coins(balance)
            .store_slice(owner_address)
            .store_slice(jetton_master_address)
            .store_ref(jetton_wallet_code)
           .end_cell();
}

cell calculate_jetton_wallet_state_init(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
  return begin_cell()
          .store_uint(0, 2)
          .store_dict(jetton_wallet_code)
          .store_dict(pack_jetton_wallet_data(0, owner_address, jetton_master_address, jetton_wallet_code))
          .store_uint(0, 1)
         .end_cell();
}

slice calculate_jetton_wallet_address(cell state_init) inline {
  return begin_cell().store_uint(4, 3)
                     .store_int(workchain(), 8)
                     .store_uint(cell_hash(state_init), 256)
                     .end_cell()
                     .begin_parse();
}

slice calculate_user_jetton_wallet_address(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
  return calculate_jetton_wallet_address(calculate_jetton_wallet_state_init(owner_address, jetton_master_address, jetton_wallet_code));
}


;; Jetton Wallet Smart Contract

{-

NOTE that this tokens can be transferred within the same workchain.

This is suitable for most tokens, if you need tokens transferable between workchains there are two solutions:

1) use more expensive but universal function to calculate message forward fee for arbitrary destination (see `misc/forward-fee-calc.cs`)

2) use token holder proxies in target workchain (that way even 'non-universal' token can be used from any workchain)

-}

int min_tons_for_storage() asm "10000000 PUSHINT"; ;; 0.01 TON
int gas_consumption() asm "10000000 PUSHINT"; ;; 0.01 TON

{-
  Storage
  storage#_ balance:Coins owner_address:MsgAddressInt jetton_master_address:MsgAddressInt jetton_wallet_code:^Cell = Storage;
-}

(int, slice, slice, cell) load_data() inline {
  slice ds = get_data().begin_parse();
  return (ds~load_coins(), ds~load_msg_addr(), ds~load_msg_addr(), ds~load_ref());
}

() save_data (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) impure inline {
  set_data(pack_jetton_wallet_data(balance, owner_address, jetton_master_address, jetton_wallet_code));
}

{-
  transfer query_id:uint64 amount:(VarUInteger 16) destination:MsgAddress
           response_destination:MsgAddress custom_payload:(Maybe ^Cell)
           forward_ton_amount:(VarUInteger 16) forward_payload:(Either Cell ^Cell)
           = InternalMsgBody;
  internal_transfer  query_id:uint64 amount:(VarUInteger 16) from:MsgAddress
                     response_address:MsgAddress
                     forward_ton_amount:(VarUInteger 16)
                     forward_payload:(Either Cell ^Cell) 
                     = InternalMsgBody;
-}

() send_tokens (slice in_msg_body, slice sender_address, int msg_value, int fwd_fee) impure {
  int query_id = in_msg_body~load_uint(64);
  int jetton_amount = in_msg_body~load_coins();
  slice to_owner_address = in_msg_body~load_msg_addr();
  force_chain(to_owner_address);
  (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
  balance -= jetton_amount;

  throw_unless(705, equal_slices(owner_address, sender_address));
  throw_unless(706, balance >= 0);

  cell state_init = calculate_jetton_wallet_state_init(to_owner_address, jetton_master_address, jetton_wallet_code);
  slice to_wallet_address = calculate_jetton_wallet_address(state_init);
  slice response_address = in_msg_body~load_msg_addr();
  cell custom_payload = in_msg_body~load_dict();
  int forward_ton_amount = in_msg_body~load_coins();
  slice either_forward_payload = in_msg_body;
  var msg = begin_cell()
    .store_uint(0x18, 6)
    .store_slice(to_wallet_address)
    .store_coins(0)
    .store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
    .store_ref(state_init);
  var msg_body = begin_cell()
    .store_uint(op::internal_transfer(), 32)
    .store_uint(query_id, 64)
    .store_coins(jetton_amount)
    .store_slice(owner_address)
    .store_slice(response_address)
    .store_coins(forward_ton_amount)
    .store_slice(either_forward_payload)
    .end_cell();

  msg = msg.store_ref(msg_body);
  int fwd_count = forward_ton_amount ? 2 : 1;
  throw_unless(709, msg_value >
                     forward_ton_amount +
                     ;; 3 messages: wal1->wal2,  wal2->owner, wal2->response
                     ;; but last one is optional (it is ok if it fails)
                     fwd_count * fwd_fee +
                     (2 * gas_consumption() + min_tons_for_storage()));
                     ;; universal message send fee calculation may be activated here
                     ;; by using this instead of fwd_fee
                     ;; msg_fwd_fee(to_wallet, msg_body, state_init, 15)

  send_raw_message(msg.end_cell(), 64); ;; revert on errors
  save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}

{-
  internal_transfer  query_id:uint64 amount:(VarUInteger 16) from:MsgAddress
                     response_address:MsgAddress
                     forward_ton_amount:(VarUInteger 16)
                     forward_payload:(Either Cell ^Cell) 
                     = InternalMsgBody;
-}

() receive_tokens (slice in_msg_body, slice sender_address, int my_ton_balance, int fwd_fee, int msg_value) impure {
  ;; NOTE we can not allow fails in action phase since in that case there will be
  ;; no bounce. Thus check and throw in computation phase.
  (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
  int query_id = in_msg_body~load_uint(64);
  int jetton_amount = in_msg_body~load_coins();
  balance += jetton_amount;
  slice from_address = in_msg_body~load_msg_addr();
  slice response_address = in_msg_body~load_msg_addr();
  throw_unless(707,
      equal_slices(jetton_master_address, sender_address)
      |
      equal_slices(calculate_user_jetton_wallet_address(from_address, jetton_master_address, jetton_wallet_code), sender_address)
  );
  int forward_ton_amount = in_msg_body~load_coins();

  int ton_balance_before_msg = my_ton_balance - msg_value;
  int storage_fee = min_tons_for_storage() - min(ton_balance_before_msg, min_tons_for_storage());
  msg_value -= (storage_fee + gas_consumption());
  if(forward_ton_amount) {
    msg_value -= (forward_ton_amount + fwd_fee);
    slice either_forward_payload = in_msg_body;

    var msg_body = begin_cell()
        .store_uint(op::transfer_notification(), 32)
        .store_uint(query_id, 64)
        .store_coins(jetton_amount)
        .store_slice(from_address)
        .store_slice(either_forward_payload)
        .end_cell();

    var msg = begin_cell()
      .store_uint(0x18, 6)
      .store_slice(owner_address)
      .store_coins(forward_ton_amount)
      .store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
      .store_ref(msg_body);

    send_raw_message(msg.end_cell(), 1);
  }

  if ((response_address.preload_uint(2) != 0) & (msg_value > 0)) {
    var msg = begin_cell()
      .store_uint(0x10, 6) ;; nobounce - int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
      .store_slice(response_address)
      .store_coins(msg_value)
      .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
      .store_uint(op::excesses(), 32)
      .store_uint(query_id, 64);
    send_raw_message(msg.end_cell(), 2);
  }

  save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}

() burn_tokens (slice in_msg_body, slice sender_address, int msg_value, int fwd_fee) impure {
  ;; NOTE we can not allow fails in action phase since in that case there will be
  ;; no bounce. Thus check and throw in computation phase.
  (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
  int query_id = in_msg_body~load_uint(64);
  int jetton_amount = in_msg_body~load_coins();
  slice response_address = in_msg_body~load_msg_addr();
  ;; ignore custom payload
  ;; slice custom_payload = in_msg_body~load_dict();
  balance -= jetton_amount;
  throw_unless(705, equal_slices(owner_address, sender_address));
  throw_unless(706, balance >= 0);
  throw_unless(707, msg_value > fwd_fee + 2 * gas_consumption());

  var msg_body = begin_cell()
      .store_uint(op::burn_notification(), 32)
      .store_uint(query_id, 64)
      .store_coins(jetton_amount)
      .store_slice(owner_address)
      .store_slice(response_address)
      .end_cell();

  var msg = begin_cell()
    .store_uint(0x18, 6)
    .store_slice(jetton_master_address)
    .store_coins(0)
    .store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
    .store_ref(msg_body);

  send_raw_message(msg.end_cell(), 64);

  save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}

() on_bounce (slice in_msg_body) impure {
  in_msg_body~skip_bits(32); ;; 0xFFFFFFFF
  (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
  int op = in_msg_body~load_uint(32);
  throw_unless(709, (op == op::internal_transfer()) | (op == op::burn_notification()));
  int query_id = in_msg_body~load_uint(64);
  int jetton_amount = in_msg_body~load_coins();
  balance += jetton_amount;
  save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}

() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
  if (in_msg_body.slice_empty?()) { ;; ignore empty messages
    return ();
  }

  slice cs = in_msg_full.begin_parse();
  int flags = cs~load_uint(4);
  if (flags & 1) {
    on_bounce(in_msg_body);
    return ();
  }
  slice sender_address = cs~load_msg_addr();
  cs~load_msg_addr(); ;; skip dst
  cs~load_coins(); ;; skip value
  cs~skip_bits(1); ;; skip extracurrency collection
  cs~load_coins(); ;; skip ihr_fee
  int fwd_fee = cs~load_coins(); ;; we use message fwd_fee for estimation of forward_payload costs

  int op = in_msg_body~load_uint(32);

  if (op == op::transfer()) { ;; outgoing transfer
    send_tokens(in_msg_body, sender_address, msg_value, fwd_fee);
    return ();
  }

  if (op == op::internal_transfer()) { ;; incoming transfer
    receive_tokens(in_msg_body, sender_address, my_balance, fwd_fee, msg_value);
    return ();
  }

  if (op == op::burn()) { ;; burn
    burn_tokens(in_msg_body, sender_address, msg_value, fwd_fee);
    return ();
  }

  throw(0xffff);
}

(int, slice, slice, cell) get_wallet_data() method_id {
  return load_data();
}

Disassembled Code

SETCP0
(:methods
  recv_internal: 
    s0 PUSH
    SEMPTY
    <{
      4 BLKDROP
    }> PUSHCONT
    IFJMP
    s0 s1 XCHG
    CTOS
    4 LDU
    s0 s1 XCHG
    1 PUSHINT
    AND
    <{
      s1 s3 XCHG
      3 BLKDROP
      11 CALLDICT
    }> PUSHCONT
    IFJMP
    LDMSGADDR
    LDMSGADDR
    s1 POP
    LDGRAMS
    s1 POP
    1 PUSHINT
    SDSKIPFIRST
    LDGRAMS
    s1 POP
    LDGRAMS
    s0 POP
    s0 s2 XCHG
    32 LDU
    260734629 PUSHINT
    s2 s-1 PUXC
    EQUAL
    <{
      s1 POP
      s4 POP
      ROTREV
      8 CALLDICT
    }> PUSHCONT
    IFJMP
    395134233 PUSHINT
    s2 s-1 PUXC
    EQUAL
    <{
      s1 POP
      s4 s4 s4 XCHG3
      s0 s3 XCHG
      9 CALLDICT
    }> PUSHCONT
    IFJMP
    s5 POP
    1499400124 PUSHINT
    EQUAL
    <{
      ROTREV
      10 CALLDICT
    }> PUSHCONT
    IFJMP
    4 BLKDROP
    16 PUSHPOW2DEC
    THROWANY

  1: 
    REWRITESTDADDR
    s0 POP
    0 PUSHINT
    EQUAL
    333 THROWIFNOT

  8: 
    s0 s3 XCHG
    64 LDU
    LDGRAMS
    LDMSGADDR
    s1 PUSH
    1 CALLDICT
    c4 PUSH
    CTOS
    LDGRAMS
    LDMSGADDR
    LDMSGADDR
    LDREF
    s0 POP
    s3 s6 XCPU
    SUB
    s2 s9 PUXC
    SDEQ
    705 THROWIFNOT
    s8 PUSH
    -1 GTINT
    706 THROWIFNOT
    4 4 2 XCPU2
    0 PUSHINT
    0 1 2 XCPUXC
    4 0 3 XC2PU
    NEWC
    s0 s4 XCHG2
    STGRAMS
    ROT
    STSLICER
    s0 s1 XCHG
    STSLICER
    STREF
    ENDC
    s2 PUSH
    NEWC
    2 STU
    s1 s2 XCHG
    STDICT
    STDICT
    1 STU
    ENDC
    s0 PUSH
    HASHCU
    0 PUSHINT
    4 PUSHINT
    NEWC
    3 STU
    8 STI
    256 STU
    ENDC
    CTOS
    s0 s4 XCHG
    LDMSGADDR
    LDDICT
    s1 POP
    LDGRAMS
    7 PUSHINT
    24 PUSHINT
    NEWC
    6 STU
    s0 s8 XCHG2
    STSLICER
    0 PUSHINT
    STGRAMS
    s1 s7 XCHG
    108 STU
    s1 s3 XCHG
    STREF
    395134233 PUSHINT
    NEWC
    32 STU
    s1 s9 XCHG
    64 STU
    s0 s7 XCHG2
    STGRAMS
    s2 PUSH
    STSLICER
    s0 s6 XCHG2
    STSLICER
    s5 PUSH
    STGRAMS
    s0 s3 XCHG2
    STSLICER
    ENDC
    s0 s5 XCHG2
    STREF
    s3 PUSH
    <{
      2 PUSHINT
    }> PUSHCONT
    <{
      1 PUSHINT
    }> PUSHCONT
    IFELSE
    s0 s8 XCHG2
    MUL
    s1 s3 XCHG
    ADD
    10000000 PUSHINT
    1 LSHIFT
    10000000 PUSHINT
    ADD
    ADD
    s1 s4 XCHG
    GREATER
    709 THROWIFNOT
    s0 s4 XCHG
    ENDC
    64 PUSHINT
    SENDRAWMSG
    s2 s3 XCHG
    NEWC
    s0 s4 XCHG2
    STGRAMS
    ROT
    STSLICER
    s0 s1 XCHG
    STSLICER
    STREF
    ENDC
    c4 POP

  9: 
    c4 PUSH
    CTOS
    LDGRAMS
    LDMSGADDR
    LDMSGADDR
    LDREF
    s0 POP
    s0 s8 XCHG
    64 LDU
    LDGRAMS
    s5 s1 XCPU
    ADD
    s0 s5 XCHG
    LDMSGADDR
    LDMSGADDR
    s5 s11 PUSH2
    SDEQ
    3 6 13 PUSH3
    0 PUSHINT
    0 1 2 XCPUXC
    4 0 3 XC2PU
    NEWC
    s0 s4 XCHG2
    STGRAMS
    ROT
    STSLICER
    s0 s1 XCHG
    STSLICER
    STREF
    ENDC
    s2 PUSH
    NEWC
    2 STU
    s1 s2 XCHG
    STDICT
    STDICT
    1 STU
    ENDC
    HASHCU
    0 PUSHINT
    4 PUSHINT
    NEWC
    3 STU
    8 STI
    256 STU
    ENDC
    CTOS
    s0 s13 XCHG2
    SDEQ
    s1 s12 XCHG
    OR
    707 THROWIFNOT
    s0 s10 XCHG
    LDGRAMS
    s10 s8 XCPU
    SUB
    10000000 PUSHINT
    10000000 PUSHINT
    s1 s2 XCHG
    MIN
    SUB
    10000000 PUSHINT
    ADD
    s1 s8 XCHG
    SUB
    s7 PUSH
    <{
      s7 s8 PUXC
      ADD
      s1 s8 XCHG
      SUB
      1935855772 PUSHINT
      NEWC
      32 STU
      s3 s-1 PUXC
      64 STU
      ROT
      STGRAMS
      s0 s7 XCHG2
      STSLICER
      s0 s7 XCHG2
      STSLICER
      ENDC
      1 PUSHINT
      24 PUSHINT
      NEWC
      6 STU
      s4 PUSH
      STSLICER
      s0 s6 XCHG2
      STGRAMS
      s1 s5 XCHG
      107 STU
      s1 s4 XCHG
      STREF
      ENDC
      1 PUSHINT
      SENDRAWMSG
      s2 s4 XCHG
      s2 s3 XCHG
    }> IFREFELSEREF
    s5 PUSH
    2 PLDU
    0 NEQINT
    s3 PUSH
    s4 s9 XCHG
    s3 s8 XCHG
    s7 POP
    4 BLKDROP

  10: 
    c4 PUSH
    CTOS
    LDGRAMS
    LDMSGADDR
    LDMSGADDR
    LDREF
    s0 POP
    s0 s7 XCHG
    64 LDU
    LDGRAMS
    LDMSGADDR
    s0 POP
    s5 s1 XCPU
    SUB
    s4 s8 PUXC
    SDEQ
    705 THROWIFNOT
    s7 PUSH
    -1 GTINT
    706 THROWIFNOT
    10000000 PUSHINT
    1 LSHIFT
    s1 s6 XCHG
    ADD
    s1 s6 XCHG
    GREATER
    707 THROWIFNOT
    2078119902 PUSHINT
    NEWC
    32 STU
    s1 s5 XCHG
    64 STU
    s0 s3 XCHG2
    STGRAMS
    s2 PUSH
    STSLICER
    s0 s1 XCHG
    STSLICER
    ENDC
    1 PUSHINT
    24 PUSHINT
    NEWC
    6 STU
    s4 PUSH
    STSLICER
    0 PUSHINT
    STGRAMS
    107 STU
    STREF
    ENDC
    64 PUSHINT
    SENDRAWMSG
    s0 s1 s3 XCHG3
    NEWC
    s0 s4 XCHG2
    STGRAMS
    ROT
    STSLICER
    s0 s1 XCHG
    STSLICER
    STREF
    ENDC
    c4 POP

  11: 
    32 PUSHINT
    SDSKIPFIRST
    c4 PUSH
    CTOS
    LDGRAMS
    LDMSGADDR
    LDMSGADDR
    LDREF
    s0 POP
    s0 s4 XCHG
    32 LDU
    395134233 PUSHINT
    s2 s-1 PUXC
    EQUAL
    2078119902 PUSHINT
    s1 s3 XCHG
    EQUAL
    s1 s2 XCHG
    OR
    709 THROWIFNOT
    64 LDU
    s1 POP
    LDGRAMS
    s0 POP
    s1 s3 XCHG
    ADD
    s2 s3 XCHG2
    NEWC
    s0 s4 XCHG2
    STGRAMS
    ROT
    STSLICER
    s0 s1 XCHG
    STSLICER
    STREF
    ENDC
    c4 POP

  get_wallet_data: 
    c4 PUSH
    CTOS
    LDGRAMS
    LDMSGADDR
    LDMSGADDR
    LDREF
    s0 POP
) 19 DICTPUSHCONST
DICTIGETJMPZ
11 THROWARG

Serialized Code

te6cckECEgEAAygAART/APSkE/S88sgLAQIBYgIDAgLMBAUAG6D2BdqJofQB9IH0gahhAgHUBgcCAUgICQC7CDHAJJfBOAB0NMDAXGwlRNfA/AL4PpA+kAx+gAxcdch+gAx+gAwAtMfghAPin6lUiC6lTE0WfAI4IIQF41FGVIgupYxREQD8AngNYIQWV8HvLqTWfAK4F8EhA/y8IAARPpEMHC68uFNgAgEgCgsCASAMDQH1APTP/oA+kAh8AHtRND6APpA+kDUMFE2oVIqxwXy4sEowv/y4sJUNEJwVCATVBQDyFAE+gJYzxYBzxbMySLIywES9AD0AMsAySD5AHB0yMsCygfL/8nQBPpA9AQx+gB3gBjIywVQCM8WcPoCF8trE8yCEBeNRRnIyx8ZgDgP3O1E0PoA+kD6QNQwCNM/+gBRUaAF+kD6QFNbxwVUc21wVCATVBQDyFAE+gJYzxYBzxbMySLIywES9AD0AMsAyfkAcHTIywLKB8v/ydBQDccFHLHy4sMK+gBRqKGCCJiWgIIImJaAErYIoYIImJaAoBihJ+MPJdcLAcMAI4A8QEQDbO1E0PoA+kD6QNQwB9M/+gD6QDBRUaFSSccF8uLBJ8L/8uLCggiYloCqABagFrzy4sOCEHvdl97Iyx8Vyz9QA/oCIs8WAc8WyXGAGMjLBSTPFnD6AstqzMmAQPsAQBPIUAT6AljPFgHPFszJ7VSAAgyAINch7UTQ+gD6QPpA1DAE0x+CEBeNRRlSILqCEHvdl94TuhKx8uLF0z8x+gAwE6BQI8hQBPoCWM8WAc8WzMntVIACayz9QB/oCIs8WUAbPFiX6AlADzxbJUAXMI5FykXHiUAioE6CCCJiWgKoAggiYloCgoBS88uLFBMmAQPsAECPIUAT6AljPFgHPFszJ7VQAcFJ5oBihghBzYtCcyMsfUjDLP1j6AlAHzxZQB88WyXGAGMjLBSTPFlAG+gIVy2oUzMlx+wAQJBAjAA4QSRA4N18EAHbCALCOIYIQ1TJ223CAEMjLBVAIzxZQBPoCFstqEssfEss/yXL7AJM1bCHiA8hQBPoCWM8WAc8WzMntVMUhatY=

Serialized Data

te6cckECEwEAA28AAYcIAPBFtm9EjpU4YjgoOZ72Fyr+DuxI31mDDl1naDvDgVaPACAj5oiRRrXokYsg/B+e0KG9xMwh5upr5I8HQzErm0/BIAEBFP8A9KQT9LzyyAsCAgFiAwQCAswFBgAboPYF2omh9AH0gfSBqGECAdQHCAIBSAkKALsIMcAkl8E4AHQ0wMBcbCVE18D8Avg+kD6QDH6ADFx1yH6ADH6ADAC0x+CEA+KfqVSILqVMTRZ8AjgghAXjUUZUiC6ljFERAPwCeA1ghBZXwe8upNZ8ArgXwSED/LwgABE+kQwcLry4U2ACASALDAIBIA0OAfUA9M/+gD6QCHwAe1E0PoA+kD6QNQwUTahUirHBfLiwSjC//LiwlQ0QnBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJIPkAcHTIywLKB8v/ydAE+kD0BDH6AHeAGMjLBVAIzxZw+gIXy2sTzIIQF41FGcjLHxmAPA/c7UTQ+gD6QPpA1DAI0z/6AFFRoAX6QPpAU1vHBVRzbXBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJ+QBwdMjLAsoHy//J0FANxwUcsfLiwwr6AFGooYIImJaAggiYloAStgihggiYloCgGKEn4w8l1wsBwwAjgEBESANs7UTQ+gD6QPpA1DAH0z/6APpAMFFRoVJJxwXy4sEnwv/y4sKCCJiWgKoAFqAWvPLiw4IQe92X3sjLHxXLP1AD+gIizxYBzxbJcYAYyMsFJM8WcPoCy2rMyYBA+wBAE8hQBPoCWM8WAc8WzMntVIACDIAg1yHtRND6APpA+kDUMATTH4IQF41FGVIguoIQe92X3hO6ErHy4sXTPzH6ADAToFAjyFAE+gJYzxYBzxbMye1UgAJrLP1AH+gIizxZQBs8WJfoCUAPPFslQBcwjkXKRceJQCKgToIIImJaAqgCCCJiWgKCgFLzy4sUEyYBA+wAQI8hQBPoCWM8WAc8WzMntVABwUnmgGKGCEHNi0JzIyx9SMMs/WPoCUAfPFlAHzxbJcYAYyMsFJM8WUAb6AhXLahTMyXH7ABAkECMADhBJEDg3XwQAdsIAsI4hghDVMnbbcIAQyMsFUAjPFlAE+gIWy2oSyx8Syz/JcvsAkzVsIeIDyFAE+gJYzxYBzxbMye1UjhgHog==

Code Cells

x{FF00F4A413F4BCF2C80B}
 x{62_}
  x{CC}
   x{D4_}
    x{0831C02497C138007434C0C05C6C2544D7C0FC02F83E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C0238208405E3514654882EA58C511100FC02780D60841657C1EF2EA4D67C02B817C12103FCBC2_}
    x{3E910C1C2EBCB8536_}
   x{4}
    x{2_}
     x{00F4CFFE803E90087C007B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C66_}
      x{CB3F5007FA0222CF165006CF1625FA025003CF16C95005CC2391729171E25008A813A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
     x{3B51343E803E903E90350C0234CFFE80145468017E903E9014D6F1C1551CDB5C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C0327E401C1D3232C0B281F2FFF274140371C1472C7CB8B0C2BE80146A2860822625A020822625A004AD822860822625A028062849F8C3C975C2C070C008E_}
      x{5279A018A182107362D09CC8CB1F5230CB3F58FA025007CF165007CF16C9718018C8CB0524CF165006FA0215CB6A14CCC971FB0010241023}
      x{10491038375F04}
      x{C200B08E218210D53276DB708010C8CB055008CF165004FA0216CB6A12CB1F12CB3FC972FB0093356C21E203C85004FA0258CF1601CF16CCC9ED54}
    x{2_}
     x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60063232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
     x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
  x{A0F605DA89A1F401F481F481A861_}

Data Cells

x{0800F045B66F448E9538623828399EF6172AFE0EEC48DF59830E5D67683BC381568F002023E6889146B5E8918B20FC1F9ED0A1BDC4CC21E6EA6BE48F0743312B9B4FC12_}
 x{FF00F4A413F4BCF2C80B}
  x{62_}
   x{CC}
    x{D4_}
     x{0831C02497C138007434C0C05C6C2544D7C0FC02F83E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C0238208405E3514654882EA58C511100FC02780D60841657C1EF2EA4D67C02B817C12103FCBC2_}
     x{3E910C1C2EBCB8536_}
    x{4}
     x{2_}
      x{00F4CFFE803E90087C007B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C66_}
       x{CB3F5007FA0222CF165006CF1625FA025003CF16C95005CC2391729171E25008A813A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
      x{3B51343E803E903E90350C0234CFFE80145468017E903E9014D6F1C1551CDB5C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C0327E401C1D3232C0B281F2FFF274140371C1472C7CB8B0C2BE80146A2860822625A020822625A004AD822860822625A028062849F8C3C975C2C070C008E_}
       x{5279A018A182107362D09CC8CB1F5230CB3F58FA025007CF165007CF16C9718018C8CB0524CF165006FA0215CB6A14CCC971FB0010241023}
       x{10491038375F04}
       x{C200B08E218210D53276DB708010C8CB055008CF165004FA0216CB6A12CB1F12CB3FC972FB0093356C21E203C85004FA0258CF1601CF16CCC9ED54}
     x{2_}
      x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60063232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
      x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
   x{A0F605DA89A1F401F481F481A861_}