a0a2a1a4a3a6a5a8a7a10a9a11a1a13a12a14a1a16a15a18a17a20a19a2a19a22a21a23a1a4a24a4a7a26a25a27a24a29a28a30a17a11a7a32a31a33a15a35a34 a36a38a37a40a39a42a41a44a43a42a45a22a46a47a41a48a45a22a43a48a49a47a50a2a50a22a51a52a46a53a45a22a54a55a49a53a56a57a41a58a41a48a59a11a60a61a41a62a39a48a49a63a41a44a39a64a51a65a45a66a41a58a41a44a59a20a49a67a39a48a49a47a43a42a68a52a69a70a46a47a49a53a39a58a41a48a59a22a49a71a39a10a72a66a39a10a41a44a49a47a54 a69a73a39a58a49a63a74a66a75a76a49a53a46a63a41a44a49a53a50a77a41a48a51 a75a22a43a42a51a78a68a66a69a73a50a22a49a80a79 a36a77a81a66a59a20a51a65a45a22a82a70a50a84a83a76a49a8a75a22a43a48a49a47a46a53a69a73a39a48a49a27a39a48a51a85a41a44a59a11a60a86a41a87a69a73a41a88a46a53a60a80a56a67a60a61a46a47a41a6a60a80a39a87a60a35a46a53a51a80a56a89a41a48a43a44a60a80a46a63a41a6a83a90a49a63a41a26a91a18a49a47a49a53a56a67a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a92a75a22a43a42a51a66a46a47a45a22a43a48a49a47a43 a60a80a56a20a50a67a39a48a51a61a93a94a41a26a91a95a60a80a43a42a49a23a50a22a49a63a68a65a49a47a82a70a51a65a75a76a49a53a43a96a60a80a56a22a50a67a41a48a59a52a45a20a39a96a56a22a49a47a49a53a50a22a39a6a41a44a51a58a83a76a49a23a45a20a56a22a50a22a49a53a43a42a39a42a41a44a60a80a56a22a50a11a60a80a83a20a82a70a49a23a83a57a72a97a75a22a43a42a51a66a46a47a45a22a43a48a49a47a43a48a39a98a60a61a56a22a50 a50a22a49a63a68a65a49a47a82a70a51a65a75a76a49a53a43a42a39a53a79 a36a100a99a98a49a47a39a48a46a53a43a42a69a70a83a76a49a53a39a27a101a30a102a20a103a80a104a105a41a44a59a20a49a106a39a10a72a52a39a42a41a44a49a47a54a107a91a87a69a70a82a70a82a108a50a22a51a85a83a22a45a20a41a109a56a22a51a80a41a98a102a11a110a86a101a111a69a73a41a88a91a87a69a70a82a73a82a105a50a22a51a55a69a73a41a113a112a114a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a6a83a22a45a20a41a6a56a22a51a61a41 a59a22a51a78a91a117a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a87a91a87a69a70a82a73a82a108a83a76a49a106a60a80a46a118a59a22a69a70a49a63a68a65a49a47a50a120a119a63a79 a121a117a1a4a19a22a7a32a122a33a15a123a19a20a21a23a1a4a24a4a7a32a25a27a24a29a28a30a17a22a7a32a31a18a15a35a34 a36a38a37a109a56a124a60a61a83a22a39a42a41a48a43a44a60a80a46a63a41a109a50a20a49a53a39a48a46a47a43a48a69a73a75a20a41a44a69a73a51a65a56a125a51a80a93a13a41a44a59a22a49a8a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a8a41a44a59a11a60a86a41a87a39a48a49a53a43a10a68a65a49a47a39a98a60a80a39a87a60a35a83a11a60a80a39a42a69a70a39a95a93a114a51a65a43a8a112a126a51a65a43a88a50a22a49a47a39a48a46a47a43a48a69a70a83a76a49a53a39a44a119 a69a116a41a44a39a88a50a22a49a63a41a118a60a80a69a73a82a70a49a53a50a125a50a20a49a53a39a48a69a73a127a65a56a124a60a80a56a22a50a97a69a70a54a55a75a22a82a70a49a47a54a62a49a47a56a89a41a44a60a61a41a44a69a73a51a65a56a105a79 a36a100a99a98a49a47a39a48a46a53a43a42a69a70a83a76a49a53a39a98a102a11a110a86a101a128a41a44a59a22a49a27a43a48a49a47a129a89a45a22a69a70a43a42a49a53a54a55a49a53a56a57a41a44a39a88a91a87a69a70a82a73a82a108a83a76a49a106a60a80a46a118a59a22a69a70a49a63a68a65a49a47a50a105a79 a36a100a130a131a43a48a69a73a54a58a60a61a43a42a72a62a43a48a49a132a60a61a50a22a49a53a43a42a39a87a91a87a69a73a82a70a82a90a83a90a49a8a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a106a50a22a49a53a39a42a69a70a127a65a56a22a49a47a43a48a39a6a60a80a56a22a50a84a69a73a54a62a75a22a82a73a49a53a54a55a49a53a56a57a41a44a49a47a43a48a39a95a43a48a60a61a41a44a59a20a49a53a43a95a41a44a59a22a60a80a56a124a45a20a39a48a49a53a43a42a39 a51a65a43a88a54a62a60a80a56a11a60a61a127a65a49a53a54a55a49a53a56a57a41a132a79 a36a38a133a88a59a22a49a27a127a65a51a65a60a80a82a70a39a87a60a80a56a20a50a124a46a47a51a65a56a22a39a42a41a48a43a44a60a80a69a73a56a57a41a44a39a87a39a48a75a76a49a53a46a47a69a73a134a11a49a47a50a124a69a73a56a97a43a42a49a53a129a89a45a22a69a73a43a48a49a53a54a55a49a53a56a57a41a48a39a109a50a22a51a52a46a53a45a20a54a62a49a47a56a89a41a6a39a42a59a22a51a65a45a22a82a73a50a97a83a76a49a8a41a44a43a48a60a80a46a53a49a136a135 a60a80a83a20a82a70a49a98a41a44a51a35a41a48a59a22a49a27a50a22a49a53a39a42a69a70a127a65a56a97a39a48a75a76a49a53a46a47a69a73a134a11a46a53a60a61a41a44a69a73a51a65a56a137a112a138a60a80a56a22a50a125a93a114a43a42a51a65a54a139a41a44a59a20a49a53a43a48a49a8a41a48a51a85a41a48a59a22a49a27a46a53a51a52a50a22a49a78a119a136a79 a140 a141 a31a18a15a18a17a20a1a16a15a18a17a20a19a77a31a143a142a97a9a11a1a4a3a6a5a8a7a32a9a11a1a16a12a14a1a13a15a18a17a22a19a2a144a8a31a87a24a4a5a8a12a14a1a16a15a18a17a105a34 a36a38a145a47a146a90a147a78a148a150a149a29a151a13a152a16a153a80a147a78a154a126a149a76a146a156a155a157a99a98a49a53a39a48a46a47a43a48a69a73a83a90a49a47a39a64a41a44a59a22a49a71a56a20a49a53a49a53a50a2a93a114a51a65a43a62a41a44a59a22a49a158a39a10a72a66a39a10a41a44a49a47a54 a60a80a56a22a50a2a75a22a82a70a60a80a46a53a49a47a39a64a69a73a41a58a69a70a56a2a46a47a51a65a56a57a41a44a49a63a74a52a41a53a159 a83a22a43a42a69a70a49a63a160a22a72a125a50a22a49a47a39a48a46a53a43a42a69a70a83a22a69a73a56a22a127a85a69a73a41a48a39a87a93a114a45a20a56a22a46a47a41a48a69a70a51a65a56a22a39a87a60a61a56a22a50a124a75a20a43a48a49a53a39a42a49a53a56a57a41a44a69a73a56a22a127a64a60a35a43a48a60a61a41a44a69a73a51a65a56a11a60a80a82a73a49a96a93a114a51a65a43a95a41a44a59a20a49a106a39a42a51a80a93a94a41a26a91a18a60a80a43a48a49a61a79a95a99a98a49a63a135 a39a42a46a53a43a48a69a73a83a90a49a47a39a113a59a20a51a150a91a161a41a48a59a22a49a55a39a42a72a52a39a42a41a48a49a53a54a123a134a22a41a44a39a106a69a70a56a57a41a44a51a84a41a44a59a20a49a62a51a78a68a65a49a47a43a44a60a80a82a73a82a156a83a22a45a22a39a48a69a73a56a22a49a53a39a42a39a23a51a65a43a106a39a42a41a48a43a44a60a61a41a48a49a53a127a65a69a73a46a85a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a113a51a80a93 a41a48a59a22a49a27a51a65a43a48a127a57a60a61a56a22a69a70a162a53a60a61a41a44a69a73a51a65a56a64a46a53a51a80a54a62a54a55a69a70a39a42a39a48a69a70a51a80a56a22a69a70a56a22a127a106a41a44a59a22a49a27a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a80a79 a36a164a163a90a165a4a166a47a147a78a167a52a168 a169a170a149a29a151a13a167a52a171a32a155a109a81a66a49a47a41a48a39a109a51a65a45a66a41a6a41a48a59a22a49a106a39a42a72a52a39a42a41a48a49a53a54a92a54a62a51a52a50a22a49a47a82a29a39a48a59a22a51a78a91a87a69a70a56a20a127a62a41a44a59a20a49a106a43a42a49a53a82a70a60a61a41a44a69a73a51a65a56a22a39a48a59a20a69a70a75a22a39a88a83a76a49a47a41a26a91a33a49a53a56 a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a107a46a47a51a65a54a62a75a76a51a65a56a22a49a47a56a57a41a44a39a87a60a80a56a22a50a125a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a92a60a80a56a20a50a97a69a116a41a44a39a95a49a47a56a57a68a66a69a73a43a48a51a65a56a20a54a62a49a47a56a89a41a53a79a156a37a96a56a97a60a80a83a22a39a10a41a44a43a44a60a61a46a47a41a87a50a11a60a61a41a44a60 a54a55a51a66a50a20a49a53a82a105a39a42a59a22a51a65a45a22a82a73a50a124a60a61a82a70a39a48a51a85a83a76a49a27a50a22a49a53a39a42a46a53a43a48a69a73a83a90a49a47a50a124a69a116a93a16a60a80a75a22a75a22a43a42a51a65a75a22a43a48a69a70a60a61a41a44a49a98a41a48a51a35a41a44a59a22a49a8a41a26a72a52a75a90a49a106a51a80a93a16a39a42a72a52a39a42a41a48a49a53a54a97a79 a36a164a163a90a165a4a166a47a147a78a167a52a168 a172a96a173a76a149a76a171a138a152a29a147a150a154a114a149a76a146a143a155a111a133a88a59a22a49a67a93a114a45a22a56a20a50a11a60a80a54a55a49a53a56a57a41a118a60a80a82a96a60a80a39a48a39a42a45a22a54a55a75a20a41a44a69a73a51a65a56a22a39a58a51a80a56a100a91a87a59a22a69a70a46a118a59a77a41a48a59a22a49a67a39a10a72a52a39a42a41a44a49a47a54 a69a73a39 a83a11a60a61a39a48a49a53a50a111a60a80a56a20a50a137a60a61a56a89a41a48a69a70a46a47a69a70a75a11a60a61a41a48a49a53a50a71a46a118a59a22a60a80a56a22a127a65a49a47a39a106a50a20a45a22a49a174a41a44a51a84a59a11a60a80a43a42a50a11a60a80a43a42a49a174a49a47a68a80a51a65a82a70a45a20a41a48a69a70a51a65a56a108a159a105a46a118a59a11a60a80a56a22a127a80a69a70a56a22a127a125a45a22a39a42a49a53a43a8a56a22a49a47a49a53a50a22a39a47a159 a49a63a41a44a46a80a79 a36a164a175a64a149a76a176a22a171a138a166a62a112a126a39a42a51a65a54a62a49a63a41a44a69a73a54a62a49a47a39a95a46a132a60a80a82a73a82a70a49a47a50a124a177a4a152a13a146a16a153a80a147a78a154a126a149a76a146a4a176a11a171a18a178a64a167a52a179a105a152a13a154a126a148a150a167a52a168a180a167a52a146a90a147a150a166a132a119a63a181a182a133a88a59a22a49a106a39a48a49a47a43a42a68a52a69a70a46a47a49a53a39a6a75a22a43a48a51a78a68a52a69a70a50a20a49a53a50 a93a114a51a65a43a95a41a48a59a22a49a27a45a22a39a48a49a47a43a53a79a156a133a88a59a22a69a73a39a6a69a73a56a22a46a53a82a73a45a22a50a22a49a47a39a87a41a48a69a70a54a55a69a70a56a22a127a23a60a80a56a22a50a124a60a80a46a53a46a47a45a22a43a44a60a61a46a47a72a84a43a48a49a47a129a89a45a22a69a70a43a42a49a53a54a55a49a53a56a57a41a44a39a47a79 a36a164a183a113a149a76a146a16a166a63a147a78a148a150a176a11a154a138a146a76a147a150a166a80a155a97a184a18a51a65a56a22a39a10a41a44a43a48a60a80a69a70a56a57a41a44a39a35a51a80a56a185a59a22a51a78a91a186a41a48a59a22a49a64a127a65a51a65a60a80a82a70a39a113a46a132a60a80a56a187a83a76a49a125a60a80a46a118a59a22a69a73a49a47a68a80a49a53a50a188a112a126a43a42a49a53a39a42a41a48a43a48a69a73a46a47a41a44a69a73a51a65a56a22a39a113a51a65a56 a41a48a59a22a49a27a83a90a49a47a59a11a60a132a68a66a69a73a51a65a43a88a51a80a93a13a41a44a59a22a49a27a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a113a60a80a56a22a50a84a41a44a59a22a49a8a93a114a43a48a49a47a49a53a50a22a51a80a54a189a51a80a93a13a41a44a59a22a49a27a50a22a49a47a39a48a69a70a127a80a56a22a49a53a43a44a119a63a79 a133a88a59a22a49a47a39a48a49a18a60a80a43a48a49a156a43a48a49a47a39a42a41a48a43a48a69a70a46a63a41a44a69a73a51a65a56a22a39a29a51a65a56a113a60a80a82a70a82a73a51a78a91a95a60a80a83a20a82a70a49a182a50a22a49a47a39a48a69a73a127a65a56a22a39a13a51a65a43a29a41a44a59a22a49a131a91a18a60a78a72a52a39a13a41a44a59a22a49a156a127a65a51a57a60a61a82a70a39a29a46a132a60a61a56a113a83a76a49a18a60a61a46a118a59a22a69a70a49a63a68a65a49a53a50a108a159 a49a61a79a190a127a22a79a116a159a120a39a44a60a61a93a114a49a63a41a26a72a84a46a53a51a65a56a20a39a42a41a44a43a48a60a80a69a70a56a57a41a48a39a53a159a120a59a11a60a80a43a42a50a20a91a95a60a61a43a48a49a80a159a120a75a22a43a42a51a65a127a65a43a48a60a80a54a62a54a55a69a70a56a20a127a35a82a191a60a80a56a22a127a80a45a11a60a80a127a65a49a47a39a53a159a120a60a80a56a22a50a97a39a42a41a44a60a80a56a22a50a11a60a61a43a48a50a22a39a87a41a44a59a11a60a86a41 a54a174a45a20a39a42a41a35a83a76a49a58a93a114a51a65a82a73a82a70a51a78a91a18a49a47a50a105a79a67a133a88a59a20a49a47a72a187a60a61a82a70a39a48a51a67a69a70a56a22a46a47a82a70a45a22a50a22a49a62a129a89a45a11a60a80a82a70a69a116a41a26a72a111a43a48a49a53a129a89a45a22a69a73a43a48a49a47a54a62a49a47a56a89a41a48a39a53a159a156a39a48a45a20a46a118a59a38a60a61a39a174a54a58a60a61a69a70a56a57a41a118a60a80a69a73a56a66a135 a60a80a83a20a69a70a82a70a69a116a41a26a72a65a159a66a60a132a68a80a60a61a69a70a82a191a60a61a83a22a69a70a82a73a69a73a41a26a72a65a159a89a49a63a41a44a46a80a79 a36a38a192a106a148a86a154a126a149a120a148a86a154a114a147a78a154a126a167a52a166a80a155a95a133a88a59a20a69a70a39a6a39a48a49a53a46a63a41a44a69a73a51a65a56a67a83a11a60a61a39a48a69a70a46a53a60a80a82a70a82a116a72a64a39a42a75a90a49a47a46a53a69a73a134a22a49a53a39a96a59a20a51a150a91a117a41a44a43a44a60a61a50a22a49a53a51a80a193a90a39a109a91a87a69a73a82a70a82a105a83a76a49a106a54a58a60a80a50a20a49a113a69a116a93a131a60a80a82a73a82a105a51a80a93 a41a48a59a22a49a62a127a80a51a57a60a80a82a70a39a106a60a80a56a20a50a180a46a53a51a80a56a22a39a42a41a48a43a44a60a80a69a73a56a89a41a48a39a113a46a53a60a80a56a22a56a22a51a61a41a174a83a76a49a62a46a47a51a65a54a62a75a20a82a70a49a47a41a48a49a53a82a116a72a128a60a80a46a118a59a22a69a73a49a47a68a65a49a47a50a185a69a70a56a128a41a44a59a20a49a62a50a22a49a47a39a48a69a73a127a65a56a52a194a164a39a42a51a65a54a55a49 a54a62a60a132a72a64a83a76a49a106a54a55a51a65a43a42a49a8a69a70a54a55a75a90a51a65a43a10a41a118a60a80a56a57a41a95a41a48a59a11a60a80a56a84a51a80a41a48a59a22a49a53a43a42a39a53a79a33a195a27a45a20a69a70a50a22a49a47a39a87a41a48a43a44a60a80a50a20a49a53a51a80a193a90a39a6a60a80a54a62a51a80a56a22a127a35a50a22a49a53a39a42a69a70a127a65a56a84a50a22a49a47a46a53a69a73a39a48a69a70a51a80a56a22a39a53a79 a36a38a145a47a146a90a147a78a167a89a148a150a196a197a176a11a153a65a167a52a166a38a147a78a149a198a147a78a199a13a167a200a167a52a146a90a173a4a154a114a148a150a149a90a146a13a168a180a167a52a146a90a147a57a155a100a201a26a56a22a75a22a45a20a41a97a51a65a43a84a51a65a45a20a41a48a75a22a45a20a41a97a69a70a56a57a41a48a49a53a43a42a93a126a60a61a46a53a49a53a39a97a60a80a56a20a50a188a43a42a49a53a82a70a49a63a68a61a60a80a56a57a41 a60a80a39a42a39a48a45a22a54a55a75a20a41a48a69a70a51a65a56a22a39a109a60a80a83a76a51a65a45a20a41a6a49a53a56a57a68a52a69a70a43a42a51a65a56a22a54a55a49a53a56a57a41a118a60a61a82a13a46a47a51a65a54a55a75a90a51a65a56a20a49a53a56a57a41a44a39a6a91a87a69a73a41a44a59a84a91a87a59a22a69a73a46a118a59a67a41a44a59a22a49a106a39a48a51a61a93a94a41a26a91a95a60a80a43a42a49a113a91a87a69a73a82a70a82a29a83a76a49 a69a73a56a89a41a48a49a53a43a48a60a80a46a47a41a48a69a70a56a22a127a22a79 a36a164a175a125a171a126a149a76a166a132a166a53a176a20a148a150a165a182a155a88a99a98a49a47a134a11a56a20a69a73a41a44a69a73a51a65a56a22a39a88a51a80a93a13a41a44a49a47a46a118a59a22a56a22a69a73a46a132a60a80a82a105a41a48a49a53a43a48a54a55a39a87a45a22a39a48a49a47a50a124a69a73a56a125a41a44a59a22a49a27a50a22a51a52a46a53a45a22a54a55a49a53a56a57a41a53a79 a36a38a145a47a146a16a151a4a167a57a202a29a167a52a166a80a155a95a203a143a60a80a43a42a69a70a51a65a45a22a39a95a41a26a72a52a75a76a49a53a39a6a51a80a93a16a69a70a56a22a50a22a49a136a74a66a49a53a39a6a54a58a60a132a72a64a83a76a49a27a75a22a43a48a51a78a68a52a69a70a50a20a49a53a50a105a79 a204 a205 a17a52a17a22a9a120a7a10a206a8a5a109a17a20a1a13a19a100a31a33a142a84a28a161a122a143a31a6a31a87a144a207a9a11a1a4a3a6a5a8a7a10a9a11a1a13a12a14a1a13a15a95a17a20a19a77a144a8a31a87a24a4a5a8a12a14a1a16a15a18a17a105a34 a36a100a208a87a49a132a60a80a50a22a60a80a83a22a82a70a49a27a60a61a56a22a50a124a45a20a56a22a50a22a49a53a43a42a39a42a41a44a60a80a56a22a50a11a60a80a83a20a82a70a49a27a83a57a72a125a46a53a45a22a39a10a41a44a51a65a54a55a49a53a43a42a39a53a159a120a45a22a39a42a49a53a43a48a39a47a159a76a60a80a56a22a50a97a50a22a49a53a39a42a69a70a127a65a56a22a49a47a43a48a39a47a79 a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a87a51a65a56a22a82a73a72a58a49a63a74a52a41a44a49a47a43a48a56a11a60a61a82a13a39a10a72a52a39a42a41a44a49a47a54a92a83a90a49a47a59a11a60a132a68a66a69a73a51a65a43a106a112a126a83a20a82a191a60a80a46a118a209a64a83a76a51a132a74a22a119a63a79 a36a77a81a52a41a48a43a48a45a22a46a63a41a44a45a22a43a42a49a53a50a97a41a44a51a85a83a90a49a27a49a53a60a80a39a42a72a64a41a48a51a85a46a118a59a11a60a80a56a22a127a65a49a61a79 a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a87a83a90a51a80a41a48a59a124a127a80a51a57a60a80a82a70a39a95a60a80a56a22a50a97a46a53a51a65a56a22a39a10a41a44a43a48a60a80a69a70a56a57a41a44a39a47a79 a36a38a37a109a83a22a82a70a49a98a41a48a51a55a39a42a49a53a43a10a68a65a49a174a60a61a39a109a60a35a43a42a49a47a93a114a49a53a43a42a49a53a56a22a46a47a49a106a41a48a51a66a51a80a82a108a93a114a51a65a43a88a39a42a72a52a39a10a41a44a49a53a54a107a54a62a60a80a69a73a56a89a41a44a60a80a69a70a56a20a49a53a43a48a39a47a79 a36a77a184a18a51a65a56a57a41a44a60a80a69a70a56a22a39a87a51a65a56a20a82a73a72a58a41a48a49a53a39a10a41a118a60a80a83a22a82a73a49a8a43a48a49a47a129a52a45a20a69a70a43a48a49a47a54a62a49a47a56a57a41a44a39a53a79 a210a96a211a187a212a52a211 a212a52a219 a211 a104a26a213a118a214a63a104a197a103a57a215a53a216a70a213a85a217a44a213a48a218 a217a44a213a63a220a58a213 a104a197a221a27a133a88a59a22a49a62a39a10a72a52a39a42a41a44a49a47a54a123a39a48a59a22a51a65a45a20a82a70a50a128a83a90a49a85a49a53a60a80a39a42a72a158a41a48a51a97a45a20a39a48a49a55a83a89a72a71a49a63a74a66a75a90a49a47a43a48a69a222a135 a49a47a56a22a46a53a49a47a50a180a46a47a51a65a56a57a41a44a43a48a51a80a82a70a82a70a49a47a43a48a39a96a60a80a56a22a50a128a39a48a59a22a51a80a45a22a82a70a50a128a83a76a49a35a51a65a43a48a127a57a60a61a56a22a69a70a162a47a49a53a50a158a69a70a56a158a39a42a45a22a46a118a59a137a60a125a91a18a60a132a72a67a41a48a59a11a60a61a41a27a45a22a39a42a49a53a43a27a49a53a43a42a43a48a51a65a43a42a39 a60a61a43a48a49a27a54a62a69a73a56a22a69a70a54a55a69a70a162a47a49a53a50a105a79 a210 a212a52a219 a211 a104a26a213a118a214a63a104a197a103a57a215a53a216a70a213a87a217a44a213a48a218 a217a44a213a63a220a58a213 a104a197a221a182a223a30a74a66a75a90a49a47a43a48a69a73a49a53a56a22a46a47a49a53a50a55a46a53a51a65a56a57a41a44a43a42a51a65a82a70a82a73a49a53a43a42a39a182a39a48a59a22a51a80a45a22a82a70a50a85a83a76a49a88a60a80a83a22a82a73a49a18a41a44a51a8a45a22a39a42a49a6a60a80a82a70a82a52a51a80a93 a41a48a59a22a49a18a39a10a72a52a39a42a41a44a49a47a54a224a93a114a45a22a56a20a46a47a41a44a69a73a51a65a56a22a39a16a60a61a93a94a41a44a49a47a43a182a60a87a41a44a51a80a41a44a60a80a82a89a51a80a93a22a41a26a91a33a51a98a59a22a51a65a45a22a43a42a39a16a41a48a43a44a60a80a69a73a56a22a69a70a56a22a127a20a79a13a37a6a93a94a41a44a49a47a43a16a41a44a59a20a69a70a39a4a41a44a43a44a60a61a69a70a56a22a69a73a56a22a127a22a159 a41a48a59a22a49a109a60a78a68a80a49a53a43a48a60a80a127a65a49a87a56a89a45a22a54a174a83a76a49a53a43a143a51a80a93a108a49a47a43a48a43a42a51a65a43a48a39a156a54a62a60a80a50a22a49a88a83a57a72a85a49a63a74a66a75a76a49a53a43a48a69a73a49a53a56a22a46a47a49a53a50a62a45a22a39a48a49a47a43a48a39a18a39a42a59a22a51a65a45a22a82a73a50a85a56a22a51a80a41a143a49a63a74a66a46a53a49a47a49a53a50 a41a26a91a33a51a58a75a76a49a53a43a88a50a22a60a78a72a80a79 a36a77a184a18a51a65a56a20a39a48a69a70a39a10a41a44a49a47a56a89a41a53a159a120a46a53a51a65a54a55a75a22a82a70a49a63a41a44a49a61a159a22a45a22a56a11a60a80a54a23a83a22a69a70a127a65a45a20a51a65a45a22a39a53a159a22a60a80a56a22a50a84a43a48a49a53a60a80a82a70a69a73a39a42a41a44a69a73a46a80a79 a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a6a60a80a46a53a46a47a49a53a75a20a41a44a60a80a83a22a82a70a49a27a43a42a49a53a39a48a75a76a51a65a56a22a39a42a49a53a39a6a41a44a51a85a45a22a56a22a50a22a49a47a39a48a69a73a43a48a49a53a50a97a49a47a68a80a49a53a56a57a41a44a39a47a79 a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a16a69a73a56a22a46a53a43a42a49a53a54a55a49a53a56a57a41a118a60a61a82a57a39a48a45a22a83a22a39a42a49a47a41a48a39a182a69a73a93a66a50a22a49a53a39a42a69a70a43a42a49a53a50a23a51a80a43a13a54a55a69a70a56a20a69a70a54a174a45a22a54a188a60a80a56a22a50a113a54a58a60a150a74a20a69a73a54a174a45a22a54a225a93a114a45a22a56a22a46a47a41a48a69a70a51a65a56a22a60a80a82a70a69a116a41a26a72a65a79 a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a174a41a44a59a22a49a125a46a118a59a22a60a80a56a22a127a65a49a47a39a62a60a61a56a89a41a48a69a70a46a47a69a70a75a11a60a61a41a48a49a53a50a185a69a73a56a185a41a44a59a22a49a64a93a114a45a66a41a44a45a22a43a42a49a111a112a126a69a70a56a137a41a44a59a22a49a125a49a47a56a89a68a52a69a73a43a48a51a65a56a22a54a55a49a53a56a57a41a85a51a65a43a23a69a70a56a185a41a44a59a20a49 a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a78a119a136a79 a226 Producibility Constraints Production Requirements In-service Experience Resolution Issue Lessons Learned Accidents Incidents and Technology Changes Market Driven Requirements Airline Industry Trends Requirements Customer Public Perceptions Regulatory Requirements Political World Airports and Groundside Requirements Airspace and ATC Requirements Infrastructure Requirements Boeing Ensuring a Successful Product Right Product Appropriate and Validated Requirements a227 Allocated Requirements FHA Trees Fault FMEA Preliminary Validate Analyze and Compliance Requirements Testing Verification Certification Product Successful Design Detailed Safety Reliability Availability Maintainability Supportability Analyses Physical and Preliminary Functional Def. Product Right Types of Specifications Informal Free form, natural language Ambiguity and lack of organization can lead to incompleteness, inconsistency, and misunderstandings Formatted Standardized syntax (e.g., UML) Basic consistency and completeness checks Imprecise semantics implies other sources of error may still be present. c Copyright Nancy Leveson, Sept. 1999 a228 Intent Specifications Part-Whole Blackbox Behavior Physical Representation Principles System Design Purpose System Design Representation SystemOperatorEnvironment Verification Validation Refinement Operations Intent Each level supports a different type of reasoning about system. Mappings between levels provide relational info necessary to reason across hierarchical levels. a229 Types of Specifications (2) Formal Syntax and semantics rigorously defined. Precise form, perhaps mathematical. Eliminate imprecision and ambiguity. Provide basis for mathematically verifying equivalence between specification and implementation. May be hard to read without training. Semantic distance too great? c Copyright Nancy Leveson, Sept. 1999 a230 INPUT SPACE OUTPUT SPACE I OF F(I) = O A program is a mathematical object A programming language is a mathematical language. Therefore, we can prove properties about the program. e.g. does it do what it is supposed to do does it not do anything harmful Building a model like engineers do, but need discrete rather than continuous mathematics. Copyright Nancy Leveson, Sept. 1999 c a231 Formal Specifications Goal: Describe external behavior without describing or constraining internal design (implementation). Formal method has 2 parts: 1. Logical theory: means by which reason about specs, properties, and programs. First-order predicate calculus (quantification over variables) Second-order predicate calculus (quantification over relations) Temporal logic 2. Structuring theory: defines elements being reasoned about c Copyright Nancy Leveson, Sept. 1999 a232 Structuring Theory 1. Descriptive Specifications: State desired properties in a purely declarative way. Input-output assertions Algebraic specifications (set of axioms) 2. Operational Specification: Describe desired behavior by providing a model of system. Abstract Model (in terms of previously defined mathematical objects, e.g., sets and sequences operations, e.g., functions and mappings) State machine (states and transitions between states) Copyright Nancy Leveson, Sept. 1999 c a140a78a233 Input-Output Assertions S {P} Q If S holds before execution of S, then Q holds afterward. Examples: n sum = a j j=1 1. sum = 0 { for i=1 to n do sum:=sum+a(i) } 2. proc search(A,n,x) int; pre n 0 (result = 0 (result = i i {1,...,i-1} : A[i] = x) {1,...,n} : A[i] = x)i post 1 i n A[i] = x c Copyright Nancy Leveson, Sept. 1999 a140a65a140 Algebraic Specifications Uses: (1) set of objects (2) set of operations (3) axioms specifying behavior of operations Two parts to a specification: syntax axioms Example: STACK Intuitive definitions of stack operations: NEW creates an empty stack PUSH adds a new item to top of stack TOP returns a copy of top item POP removes top item Empty tests for an empty stack c Copyright Nancy Leveson, Sept. 1999 a140a150a204 Algebraic Specifications (2) SYNTAX: OPERATION DOMAIN RANGE New ( ) Stack Push Pop Top Empty (Stack, Item) Stack (Stack) Stack (Stack) Item (Stack) Boolean AXIOMS: (stk is of type Stack, itm is of type Item) 1. Empty (new) = true 2. Empty (push (stk,itm)) = false 3. Pop (new) = error 4. Top (new) = error 5. Pop (Push (stk,itm)) = stk 6. Top (Push (stk,itm)) = itm c Copyright Nancy Leveson, Sept. 1999 a140a78a226 Algebraic Specifications (3) Axioms stated in English: 1. A new stack is empty. 2. A stack is not empty immediately after pushing an item onto it. 3. Attempting to pop a new stack results in an error. 4. There is no top item on a new stack. 5. Pushing an item onto a stack and immediately popping it off leaves the stack unchanged. 6. Pushing an item onto a stack and immediately requesting the top item returns the item just pushed onto the stack. c Copyright Nancy Leveson, Sept. 1999 a227 a140 Algebraic Specifications (4) If want to add an operator Replace (stk,itm): Replace (stk,itm) = if Empty (stk) then error else Push (Pop (stk),itm) What does this do (in English)? Canonical Form: A particular stack written in terms of the operations used to form it. A = = (Push (Push (Push (New,a)), b), c), d) Top (Pop (Pop A)) = b d c b a c Copyright Nancy Leveson, Sept. 1999 a140a150a228