diff --git a/aptos-move/framework/aptos-stdlib/doc/big_ordered_map.md b/aptos-move/framework/aptos-stdlib/doc/big_ordered_map.md index 019e1f3ff3760..1c3b816b51ea1 100644 --- a/aptos-move/framework/aptos-stdlib/doc/big_ordered_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/big_ordered_map.md @@ -20,10 +20,15 @@ operation touch only few resources * it allows for parallelism for keys that are not close to each other, once it contains enough keys +TODO: all iterator functions are public(friend) for now, so that they can be modified in a +backward incompatible way. Type is also named IteratorPtr, so that Iterator is free to use later. +They are waiting for Move improvement that will allow references to be part of the struct, +allowing cleaner iterator APIs. + - [Struct `Node`](#0x1_big_ordered_map_Node) - [Enum `Child`](#0x1_big_ordered_map_Child) -- [Enum `Iterator`](#0x1_big_ordered_map_Iterator) +- [Enum `IteratorPtr`](#0x1_big_ordered_map_IteratorPtr) - [Enum `BigOrderedMap`](#0x1_big_ordered_map_BigOrderedMap) - [Constants](#@Constants_0) - [Function `new`](#0x1_big_ordered_map_new) @@ -194,14 +199,16 @@ The metadata of a child of a node. - + -## Enum `Iterator` +## Enum `IteratorPtr` An iterator to iterate all keys in the BigOrderedMap. +TODO: Once fields can be (mutable) references, this class will be deprecated. + -
enum Iterator<K> has drop
+enum IteratorPtr<K> has drop
@@ -242,7 +249,7 @@ An iterator to iterate all keys in the BigOrderedMap.
The node index of the iterator pointing to.
-child_iter: ordered_map::Iterator
+child_iter: ordered_map::IteratorPtr
Child iter it is pointing to
@@ -366,7 +373,7 @@ Internal errors.
-Trying to do an operation on an Iterator that would go out of bounds
+Trying to do an operation on an IteratorPtr that would go out of bounds
const EITER_OUT_OF_BOUNDS: u64 = 3;
@@ -700,7 +707,7 @@ Returns an iterator pointing to the first element that is greater or equal to th
key, or an end iterator if such element doesn't exist.
-public fun lower_bound<K: copy, drop, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>, key: &K): big_ordered_map::Iterator<K>
+public(friend) fun lower_bound<K: copy, drop, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>, key: &K): big_ordered_map::IteratorPtr<K>
@@ -709,7 +716,7 @@ key, or an end iterator if such element doesn't exist.
Implementation
-public fun lower_bound<K: drop + copy + store, V: store>(self: &BigOrderedMap<K, V>, key: &K): Iterator<K> {
+public(friend) fun lower_bound<K: drop + copy + store, V: store>(self: &BigOrderedMap<K, V>, key: &K): IteratorPtr<K> {
let leaf = self.find_leaf(key);
if (leaf == NULL_INDEX) {
return self.new_end_iter()
@@ -740,7 +747,7 @@ Returns an iterator pointing to the element that equals to the provided key, or
iterator if the key is not found.
-public fun find<K: copy, drop, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>, key: &K): big_ordered_map::Iterator<K>
+public(friend) fun find<K: copy, drop, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>, key: &K): big_ordered_map::IteratorPtr<K>
@@ -749,7 +756,7 @@ iterator if the key is not found.
Implementation
-public fun find<K: drop + copy + store, V: store>(self: &BigOrderedMap<K, V>, key: &K): Iterator<K> {
+public(friend) fun find<K: drop + copy + store, V: store>(self: &BigOrderedMap<K, V>, key: &K): IteratorPtr<K> {
let lower_bound = self.lower_bound(key);
if (lower_bound.iter_is_end(self)) {
lower_bound
@@ -863,7 +870,7 @@ Returns a mutable reference to the element with its key at the given index, abor
Return the begin iterator.
-public fun new_begin_iter<K: copy, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::Iterator<K>
+public(friend) fun new_begin_iter<K: copy, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::IteratorPtr<K>
@@ -872,9 +879,9 @@ Return the begin iterator.
Implementation
-public fun new_begin_iter<K: copy + store, V: store>(self: &BigOrderedMap<K, V>): Iterator<K> {
+public(friend) fun new_begin_iter<K: copy + store, V: store>(self: &BigOrderedMap<K, V>): IteratorPtr<K> {
if (self.is_empty()) {
- return Iterator::End;
+ return IteratorPtr::End;
};
let node = self.borrow_node(self.min_leaf_index);
@@ -896,7 +903,7 @@ Return the begin iterator.
Return the end iterator.
-public fun new_end_iter<K: copy, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::Iterator<K>
+public(friend) fun new_end_iter<K: copy, store, V: store>(self: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::IteratorPtr<K>
@@ -905,8 +912,8 @@ Return the end iterator.
Implementation
-public fun new_end_iter<K: copy + store, V: store>(self: &BigOrderedMap<K, V>): Iterator<K> {
- Iterator::End
+public(friend) fun new_end_iter<K: copy + store, V: store>(self: &BigOrderedMap<K, V>): IteratorPtr<K> {
+ IteratorPtr::End
}
@@ -920,7 +927,7 @@ Return the end iterator.
-public fun iter_is_begin<K: store, V: store>(self: &big_ordered_map::Iterator<K>, map: &big_ordered_map::BigOrderedMap<K, V>): bool
+public(friend) fun iter_is_begin<K: store, V: store>(self: &big_ordered_map::IteratorPtr<K>, map: &big_ordered_map::BigOrderedMap<K, V>): bool
@@ -929,8 +936,8 @@ Return the end iterator.
Implementation
-public fun iter_is_begin<K: store, V: store>(self: &Iterator<K>, map: &BigOrderedMap<K, V>): bool {
- if (self is Iterator::End<K>) {
+public(friend) fun iter_is_begin<K: store, V: store>(self: &IteratorPtr<K>, map: &BigOrderedMap<K, V>): bool {
+ if (self is IteratorPtr::End<K>) {
map.is_empty()
} else {
(self.node_index == map.min_leaf_index && self.child_iter.iter_is_begin_from_non_empty())
@@ -948,7 +955,7 @@ Return the end iterator.
-public fun iter_is_end<K: store, V: store>(self: &big_ordered_map::Iterator<K>, _map: &big_ordered_map::BigOrderedMap<K, V>): bool
+public(friend) fun iter_is_end<K: store, V: store>(self: &big_ordered_map::IteratorPtr<K>, _map: &big_ordered_map::BigOrderedMap<K, V>): bool
@@ -957,8 +964,8 @@ Return the end iterator.
Implementation
-public fun iter_is_end<K: store, V: store>(self: &Iterator<K>, _map: &BigOrderedMap<K, V>): bool {
- self is Iterator::End<K>
+public(friend) fun iter_is_end<K: store, V: store>(self: &IteratorPtr<K>, _map: &BigOrderedMap<K, V>): bool {
+ self is IteratorPtr::End<K>
}
@@ -973,7 +980,7 @@ Return the end iterator.
Returns the key of the given iterator.
-public fun iter_get_key<K>(self: &big_ordered_map::Iterator<K>): &K
+public(friend) fun iter_get_key<K>(self: &big_ordered_map::IteratorPtr<K>): &K
@@ -982,8 +989,8 @@ Returns the key of the given iterator.
Implementation
-public fun iter_get_key<K>(self: &Iterator<K>): &K {
- assert!(!(self is Iterator::End<K>), error::invalid_argument(EITER_OUT_OF_BOUNDS));
+public(friend) fun iter_get_key<K>(self: &IteratorPtr<K>): &K {
+ assert!(!(self is IteratorPtr::End<K>), error::invalid_argument(EITER_OUT_OF_BOUNDS));
&self.key
}
@@ -1000,7 +1007,7 @@ Returns the next iterator, or none if already at the end iterator.
Requires the map is not changed after the input iterator is generated.
-public fun iter_next<K: copy, drop, store, V: store>(self: big_ordered_map::Iterator<K>, map: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::Iterator<K>
+public(friend) fun iter_next<K: copy, drop, store, V: store>(self: big_ordered_map::IteratorPtr<K>, map: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::IteratorPtr<K>
@@ -1009,8 +1016,8 @@ Requires the map is not changed after the input iterator is generated.
Implementation
-public fun iter_next<K: drop + copy + store, V: store>(self: Iterator<K>, map: &BigOrderedMap<K, V>): Iterator<K> {
- assert!(!(self is Iterator::End<K>), error::invalid_argument(EITER_OUT_OF_BOUNDS));
+public(friend) fun iter_next<K: drop + copy + store, V: store>(self: IteratorPtr<K>, map: &BigOrderedMap<K, V>): IteratorPtr<K> {
+ assert!(!(self is IteratorPtr::End<K>), error::invalid_argument(EITER_OUT_OF_BOUNDS));
let node_index = self.node_index;
let node = map.borrow_node(node_index);
@@ -1049,7 +1056,7 @@ Returns the previous iterator, or none if already at the begin iterator.
Requires the map is not changed after the input iterator is generated.
-public fun iter_prev<K: copy, drop, store, V: store>(self: big_ordered_map::Iterator<K>, map: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::Iterator<K>
+public(friend) fun iter_prev<K: copy, drop, store, V: store>(self: big_ordered_map::IteratorPtr<K>, map: &big_ordered_map::BigOrderedMap<K, V>): big_ordered_map::IteratorPtr<K>
@@ -1058,8 +1065,8 @@ Requires the map is not changed after the input iterator is generated.
Implementation
-public fun iter_prev<K: drop + copy + store, V: store>(self: Iterator<K>, map: &BigOrderedMap<K, V>): Iterator<K> {
- let prev_index = if (self is Iterator::End<K>) {
+public(friend) fun iter_prev<K: drop + copy + store, V: store>(self: IteratorPtr<K>, map: &BigOrderedMap<K, V>): IteratorPtr<K> {
+ let prev_index = if (self is IteratorPtr::End<K>) {
map.max_leaf_index
} else {
let node_index = self.node_index;
@@ -1472,7 +1479,7 @@ Borrow a node mutably, given an index. Works for both root (i.e. inline) node an
-fun new_iter<K>(node_index: u64, child_iter: ordered_map::Iterator, key: K): big_ordered_map::Iterator<K>
+fun new_iter<K>(node_index: u64, child_iter: ordered_map::IteratorPtr, key: K): big_ordered_map::IteratorPtr<K>
@@ -1481,8 +1488,8 @@ Borrow a node mutably, given an index. Works for both root (i.e. inline) node an
Implementation
-fun new_iter<K>(node_index: u64, child_iter: ordered_map::Iterator, key: K): Iterator<K> {
- Iterator::Some {
+fun new_iter<K>(node_index: u64, child_iter: ordered_map::IteratorPtr, key: K): IteratorPtr<K> {
+ IteratorPtr::Some {
node_index: node_index,
child_iter: child_iter,
key: key,
diff --git a/aptos-move/framework/aptos-stdlib/doc/storage_slots_allocator.md b/aptos-move/framework/aptos-stdlib/doc/storage_slots_allocator.md
index a604a9090ae2b..ae5650a96ea4d 100644
--- a/aptos-move/framework/aptos-stdlib/doc/storage_slots_allocator.md
+++ b/aptos-move/framework/aptos-stdlib/doc/storage_slots_allocator.md
@@ -815,7 +815,8 @@ Remove storage slot, but reserve it for later.
fun maybe_push_to_reuse_queue<T: store>(self: &mut StorageSlotsAllocator<T>, slot_index: u64) {
if (self.should_reuse) {
- self.add_link(slot_index, Link::Vacant { next: self.reuse_head_index });
+ let link = Link::Vacant { next: self.reuse_head_index };
+ self.add_link(slot_index, link);
self.reuse_head_index = slot_index;
self.reuse_spare_count = self.reuse_spare_count + 1;
};
diff --git a/aptos-move/framework/aptos-stdlib/sources/data_structures/big_ordered_map.move b/aptos-move/framework/aptos-stdlib/sources/data_structures/big_ordered_map.move
index 8daab94747b72..50fdfa025ab5a 100644
--- a/aptos-move/framework/aptos-stdlib/sources/data_structures/big_ordered_map.move
+++ b/aptos-move/framework/aptos-stdlib/sources/data_structures/big_ordered_map.move
@@ -14,6 +14,11 @@
/// operation touch only few resources
/// * it allows for parallelism for keys that are not close to each other,
/// once it contains enough keys
+///
+/// TODO: all iterator functions are public(friend) for now, so that they can be modified in a
+/// backward incompatible way. Type is also named IteratorPtr, so that Iterator is free to use later.
+/// They are waiting for Move improvement that will allow references to be part of the struct,
+/// allowing cleaner iterator APIs.
module aptos_std::big_ordered_map {
use std::error;
use std::vector;
@@ -29,7 +34,7 @@ module aptos_std::big_ordered_map {
const EKEY_ALREADY_EXISTS: u64 = 1;
/// Map key is not found
const EKEY_NOT_FOUND: u64 = 2;
- /// Trying to do an operation on an Iterator that would go out of bounds
+ /// Trying to do an operation on an IteratorPtr that would go out of bounds
const EITER_OUT_OF_BOUNDS: u64 = 3;
/// The provided configuration parameter is invalid.
const EINVALID_CONFIG_PARAMETER: u64 = 4;
@@ -90,14 +95,16 @@ module aptos_std::big_ordered_map {
}
/// An iterator to iterate all keys in the BigOrderedMap.
- enum Iterator has drop {
+ ///
+ /// TODO: Once fields can be (mutable) references, this class will be deprecated.
+ enum IteratorPtr has drop {
End,
Some {
/// The node index of the iterator pointing to.
node_index: u64,
/// Child iter it is pointing to
- child_iter: ordered_map::Iterator,
+ child_iter: ordered_map::IteratorPtr,
/// `key` to which `(node_index, child_iter)` are pointing to
/// cache to not require borrowing global resources to fetch again
@@ -218,7 +225,7 @@ module aptos_std::big_ordered_map {
/// Returns an iterator pointing to the first element that is greater or equal to the provided
/// key, or an end iterator if such element doesn't exist.
- public fun lower_bound(self: &BigOrderedMap, key: &K): Iterator {
+ public(friend) fun lower_bound(self: &BigOrderedMap, key: &K): IteratorPtr {
let leaf = self.find_leaf(key);
if (leaf == NULL_INDEX) {
return self.new_end_iter()
@@ -238,7 +245,7 @@ module aptos_std::big_ordered_map {
/// Returns an iterator pointing to the element that equals to the provided key, or an end
/// iterator if the key is not found.
- public fun find(self: &BigOrderedMap, key: &K): Iterator {
+ public(friend) fun find(self: &BigOrderedMap, key: &K): IteratorPtr {
let lower_bound = self.lower_bound(key);
if (lower_bound.iter_is_end(self)) {
lower_bound
@@ -280,12 +287,12 @@ module aptos_std::big_ordered_map {
&mut iter.child_iter.iter_borrow_mut(children).value
}
- // ========================= Iterator functions ===========================
+ // ========================= IteratorPtr functions ===========================
/// Return the begin iterator.
- public fun new_begin_iter(self: &BigOrderedMap): Iterator {
+ public(friend) fun new_begin_iter(self: &BigOrderedMap): IteratorPtr {
if (self.is_empty()) {
- return Iterator::End;
+ return IteratorPtr::End;
};
let node = self.borrow_node(self.min_leaf_index);
@@ -296,13 +303,13 @@ module aptos_std::big_ordered_map {
}
/// Return the end iterator.
- public fun new_end_iter(self: &BigOrderedMap): Iterator {
- Iterator::End
+ public(friend) fun new_end_iter(self: &BigOrderedMap): IteratorPtr {
+ IteratorPtr::End
}
// Returns true iff the iterator is a begin iterator.
- public fun iter_is_begin(self: &Iterator, map: &BigOrderedMap): bool {
- if (self is Iterator::End) {
+ public(friend) fun iter_is_begin(self: &IteratorPtr, map: &BigOrderedMap): bool {
+ if (self is IteratorPtr::End) {
map.is_empty()
} else {
(self.node_index == map.min_leaf_index && self.child_iter.iter_is_begin_from_non_empty())
@@ -310,20 +317,20 @@ module aptos_std::big_ordered_map {
}
// Returns true iff the iterator is an end iterator.
- public fun iter_is_end(self: &Iterator, _map: &BigOrderedMap): bool {
- self is Iterator::End
+ public(friend) fun iter_is_end(self: &IteratorPtr, _map: &BigOrderedMap): bool {
+ self is IteratorPtr::End
}
/// Returns the key of the given iterator.
- public fun iter_get_key(self: &Iterator): &K {
- assert!(!(self is Iterator::End), error::invalid_argument(EITER_OUT_OF_BOUNDS));
+ public(friend) fun iter_get_key(self: &IteratorPtr): &K {
+ assert!(!(self is IteratorPtr::End), error::invalid_argument(EITER_OUT_OF_BOUNDS));
&self.key
}
/// Returns the next iterator, or none if already at the end iterator.
/// Requires the map is not changed after the input iterator is generated.
- public fun iter_next(self: Iterator, map: &BigOrderedMap): Iterator {
- assert!(!(self is Iterator::End), error::invalid_argument(EITER_OUT_OF_BOUNDS));
+ public(friend) fun iter_next(self: IteratorPtr, map: &BigOrderedMap): IteratorPtr {
+ assert!(!(self is IteratorPtr::End), error::invalid_argument(EITER_OUT_OF_BOUNDS));
let node_index = self.node_index;
let node = map.borrow_node(node_index);
@@ -351,8 +358,8 @@ module aptos_std::big_ordered_map {
/// Returns the previous iterator, or none if already at the begin iterator.
/// Requires the map is not changed after the input iterator is generated.
- public fun iter_prev(self: Iterator, map: &BigOrderedMap): Iterator {
- let prev_index = if (self is Iterator::End) {
+ public(friend) fun iter_prev(self: IteratorPtr, map: &BigOrderedMap): IteratorPtr {
+ let prev_index = if (self is IteratorPtr::End) {
map.max_leaf_index
} else {
let node_index = self.node_index;
@@ -516,8 +523,8 @@ module aptos_std::big_ordered_map {
}
}
- fun new_iter(node_index: u64, child_iter: ordered_map::Iterator, key: K): Iterator {
- Iterator::Some {
+ fun new_iter(node_index: u64, child_iter: ordered_map::IteratorPtr, key: K): IteratorPtr {
+ IteratorPtr::Some {
node_index: node_index,
child_iter: child_iter,
key: key,
diff --git a/aptos-move/framework/aptos-stdlib/sources/data_structures/storage_slots_allocator.move b/aptos-move/framework/aptos-stdlib/sources/data_structures/storage_slots_allocator.move
index cd4d287552d57..446a2b9d9b6cd 100644
--- a/aptos-move/framework/aptos-stdlib/sources/data_structures/storage_slots_allocator.move
+++ b/aptos-move/framework/aptos-stdlib/sources/data_structures/storage_slots_allocator.move
@@ -212,7 +212,8 @@ module aptos_std::storage_slots_allocator {
fun maybe_push_to_reuse_queue(self: &mut StorageSlotsAllocator, slot_index: u64) {
if (self.should_reuse) {
- self.add_link(slot_index, Link::Vacant { next: self.reuse_head_index });
+ let link = Link::Vacant { next: self.reuse_head_index };
+ self.add_link(slot_index, link);
self.reuse_head_index = slot_index;
self.reuse_spare_count = self.reuse_spare_count + 1;
};
diff --git a/crates/transaction-generator-lib/src/publishing/raw_module_data.rs b/crates/transaction-generator-lib/src/publishing/raw_module_data.rs
index 150fac67e0d74..1ab5a36273c70 100644
--- a/crates/transaction-generator-lib/src/publishing/raw_module_data.rs
+++ b/crates/transaction-generator-lib/src/publishing/raw_module_data.rs
@@ -1000,11 +1000,11 @@ pub static MODULES_SIMPLE: Lazy>> = Lazy::new(|| { vec![
pub static PACKAGE_FRAMEWORK_USECASES_METADATA: Lazy> = Lazy::new(|| {
vec![
17, 70, 114, 97, 109, 101, 119, 111, 114, 107, 85, 115, 101, 99, 97, 115, 101, 115,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 49, 50, 65, 65, 52, 57, 48, 67,
- 57, 53, 51, 70, 49, 50, 52, 51, 52, 67, 54, 49, 54, 48, 66, 66, 54, 55,
- 57, 53, 52, 53, 55, 54, 48, 66, 68, 57, 56, 49, 54, 51, 70, 68, 48, 57,
- 65, 70, 55, 49, 57, 69, 54, 48, 70, 49, 49, 53, 57, 48, 65, 68, 54, 51,
- 54, 54, 215, 1, 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 165, 144, 187, 142,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 51, 68, 54, 69, 51, 48, 54, 53,
+ 54, 52, 67, 68, 68, 69, 68, 69, 57, 50, 53, 68, 69, 52, 55, 52, 52, 57,
+ 69, 67, 51, 66, 66, 53, 48, 67, 67, 67, 49, 56, 69, 70, 70, 66, 55, 56,
+ 53, 66, 49, 69, 57, 70, 52, 68, 49, 55, 56, 66, 50, 68, 68, 66, 65, 57,
+ 56, 51, 215, 1, 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 165, 144, 187, 142,
194, 64, 12, 69, 251, 249, 10, 107, 182, 38, 236, 15, 108, 193, 238, 138, 150, 6,
170, 8, 33, 51, 49, 33, 100, 176, 163, 241, 240, 144, 16, 255, 78, 44, 30, 130,
22, 100, 23, 215, 246, 189, 167, 112, 217, 97, 104, 177, 166, 185, 99, 220, 18, 252,
@@ -1243,48 +1243,104 @@ pub static MODULE_FRAMEWORK_USECASES_FUNGIBLE_ASSET_EXAMPLE: Lazy> = Laz
#[rustfmt::skip]
pub static MODULE_FRAMEWORK_USECASES_MAPS_EXAMPLE: Lazy> = Lazy::new(|| {
vec![
- 161, 28, 235, 11, 7, 0, 0, 10, 9, 1, 0, 6, 2, 6, 16, 3, 22, 54,
- 4, 76, 12, 5, 88, 102, 7, 190, 1, 88, 8, 150, 2, 64, 16, 214, 2, 31,
- 12, 245, 2, 208, 2, 0, 0, 1, 2, 1, 5, 1, 4, 7, 2, 0, 0, 0,
- 0, 2, 6, 7, 2, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 3, 1,
- 3, 2, 4, 4, 1, 2, 3, 1, 4, 2, 0, 0, 1, 1, 7, 5, 1, 2,
- 4, 4, 1, 2, 7, 6, 1, 2, 0, 0, 1, 1, 8, 7, 8, 2, 4, 4,
- 1, 2, 8, 9, 10, 2, 2, 0, 1, 1, 2, 2, 2, 3, 2, 4, 2, 5,
- 2, 6, 2, 3, 3, 3, 1, 0, 2, 3, 3, 1, 11, 0, 2, 9, 0, 9,
- 1, 1, 11, 1, 2, 9, 0, 9, 1, 3, 7, 11, 0, 2, 9, 0, 9, 1,
- 9, 0, 9, 1, 3, 7, 11, 1, 2, 9, 0, 9, 1, 9, 0, 9, 1, 2,
- 7, 11, 0, 2, 9, 0, 9, 1, 6, 9, 0, 2, 9, 0, 9, 1, 2, 7,
- 11, 1, 2, 9, 0, 9, 1, 6, 9, 0, 1, 9, 1, 11, 3, 3, 11, 0,
- 2, 3, 3, 11, 1, 2, 3, 3, 3, 1, 3, 1, 3, 3, 3, 12, 109, 97,
- 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 15, 116, 101, 115, 116, 95, 97, 100,
- 100, 95, 114, 101, 109, 111, 118, 101, 10, 115, 105, 109, 112, 108, 101, 95, 109, 97,
- 112, 3, 110, 101, 119, 9, 83, 105, 109, 112, 108, 101, 77, 97, 112, 11, 111, 114,
- 100, 101, 114, 101, 100, 95, 109, 97, 112, 10, 79, 114, 100, 101, 114, 101, 100, 77,
- 97, 112, 3, 97, 100, 100, 6, 114, 101, 109, 111, 118, 101, 0, 0, 0, 0, 0,
+ 161, 28, 235, 11, 7, 0, 0, 10, 10, 1, 0, 8, 2, 8, 36, 3, 44, 90,
+ 4, 134, 1, 18, 5, 152, 1, 183, 1, 7, 207, 2, 142, 2, 8, 221, 4, 64,
+ 16, 157, 5, 31, 10, 188, 5, 27, 12, 215, 5, 203, 7, 0, 0, 1, 4, 1,
+ 7, 1, 10, 0, 1, 8, 0, 1, 3, 4, 2, 4, 0, 4, 0, 0, 5, 8,
+ 0, 2, 6, 7, 2, 0, 0, 0, 0, 0, 8, 8, 0, 3, 9, 7, 2, 0,
+ 0, 0, 0, 0, 11, 0, 1, 0, 1, 1, 12, 3, 4, 2, 4, 4, 1, 1,
+ 13, 5, 1, 2, 7, 4, 1, 1, 14, 6, 7, 2, 7, 4, 1, 0, 15, 9,
+ 1, 0, 1, 2, 16, 1, 10, 2, 0, 0, 1, 2, 13, 11, 1, 2, 0, 0,
+ 1, 2, 14, 12, 7, 2, 2, 0, 1, 0, 17, 9, 1, 0, 1, 3, 16, 1,
+ 14, 2, 4, 4, 1, 3, 13, 15, 1, 2, 4, 4, 1, 3, 14, 16, 17, 2,
+ 4, 4, 1, 1, 2, 2, 2, 3, 2, 5, 2, 6, 2, 7, 2, 9, 2, 10,
+ 2, 11, 2, 5, 6, 12, 3, 3, 13, 13, 0, 2, 3, 3, 4, 13, 13, 1,
+ 14, 1, 11, 1, 2, 9, 0, 9, 1, 3, 7, 11, 1, 2, 9, 0, 9, 1,
+ 9, 0, 9, 1, 2, 7, 11, 1, 2, 9, 0, 9, 1, 6, 9, 0, 1, 9,
+ 1, 13, 14, 1, 11, 1, 2, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3,
+ 8, 0, 3, 6, 12, 3, 3, 1, 11, 3, 2, 9, 0, 9, 1, 3, 7, 11,
+ 3, 2, 9, 0, 9, 1, 9, 0, 9, 1, 2, 7, 11, 3, 2, 9, 0, 9,
+ 1, 6, 9, 0, 12, 11, 3, 2, 3, 3, 3, 3, 3, 1, 3, 1, 3, 3,
+ 3, 3, 8, 2, 1, 11, 5, 2, 9, 0, 9, 1, 3, 7, 11, 5, 2, 9,
+ 0, 9, 1, 9, 0, 9, 1, 2, 7, 11, 5, 2, 9, 0, 9, 1, 6, 9,
+ 0, 2, 9, 0, 9, 1, 12, 11, 5, 2, 3, 3, 3, 3, 3, 1, 3, 1,
+ 3, 3, 3, 3, 8, 4, 12, 109, 97, 112, 115, 95, 101, 120, 97, 109, 112, 108,
+ 101, 21, 66, 105, 103, 79, 114, 100, 101, 114, 101, 100, 77, 97, 112, 82, 101, 115,
+ 111, 117, 114, 99, 101, 5, 118, 97, 108, 117, 101, 13, 66, 105, 103, 79, 114, 100,
+ 101, 114, 101, 100, 77, 97, 112, 15, 98, 105, 103, 95, 111, 114, 100, 101, 114, 101,
+ 100, 95, 109, 97, 112, 18, 79, 114, 100, 101, 114, 101, 100, 77, 97, 112, 82, 101,
+ 115, 111, 117, 114, 99, 101, 10, 79, 114, 100, 101, 114, 101, 100, 77, 97, 112, 11,
+ 111, 114, 100, 101, 114, 101, 100, 95, 109, 97, 112, 17, 83, 105, 109, 112, 108, 101,
+ 77, 97, 112, 82, 101, 115, 111, 117, 114, 99, 101, 9, 83, 105, 109, 112, 108, 101,
+ 77, 97, 112, 10, 115, 105, 109, 112, 108, 101, 95, 109, 97, 112, 31, 116, 101, 115,
+ 116, 95, 97, 100, 100, 95, 114, 101, 109, 111, 118, 101, 95, 98, 105, 103, 95, 111,
+ 114, 100, 101, 114, 101, 100, 95, 109, 97, 112, 15, 110, 101, 119, 95, 119, 105, 116,
+ 104, 95, 99, 111, 110, 102, 105, 103, 3, 97, 100, 100, 6, 114, 101, 109, 111, 118,
+ 101, 27, 116, 101, 115, 116, 95, 97, 100, 100, 95, 114, 101, 109, 111, 118, 101, 95,
+ 111, 114, 100, 101, 114, 101, 100, 95, 109, 97, 112, 3, 110, 101, 119, 26, 116, 101,
+ 115, 116, 95, 97, 100, 100, 95, 114, 101, 109, 111, 118, 101, 95, 115, 105, 109, 112,
+ 108, 101, 95, 109, 97, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95,
- 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49,
- 0, 1, 4, 0, 11, 123, 6, 210, 4, 0, 0, 0, 0, 0, 0, 12, 3, 6,
- 210, 4, 0, 0, 0, 0, 0, 0, 12, 4, 56, 0, 12, 5, 56, 1, 12, 6,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 9, 12, 8, 5, 14, 5, 50,
- 10, 8, 4, 120, 11, 7, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 7,
- 10, 7, 10, 0, 35, 3, 25, 5, 50, 10, 2, 4, 45, 13, 5, 10, 3, 10,
- 3, 56, 2, 11, 3, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 3, 10,
- 3, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 40, 5, 12, 11, 3, 6,
- 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 3, 5, 12, 13, 6, 10, 3, 10,
- 3, 56, 3, 5, 31, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 9, 9, 12,
- 10, 11, 1, 12, 11, 5, 58, 5, 116, 10, 10, 4, 117, 11, 9, 6, 1, 0,
- 0, 0, 0, 0, 0, 0, 22, 12, 9, 10, 9, 10, 11, 35, 3, 69, 5, 116,
- 10, 2, 4, 107, 13, 5, 10, 3, 10, 3, 56, 2, 13, 5, 14, 4, 56, 4,
- 1, 1, 11, 3, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 3, 10, 3,
- 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 89, 5, 93, 11, 3, 6, 64,
- 66, 15, 0, 0, 0, 0, 0, 23, 12, 3, 11, 4, 6, 177, 30, 4, 0, 0,
- 0, 0, 0, 22, 12, 4, 10, 4, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36,
- 3, 102, 5, 56, 11, 4, 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 4,
- 5, 56, 13, 6, 10, 3, 10, 3, 56, 3, 13, 6, 14, 4, 56, 5, 1, 5,
- 80, 2, 8, 12, 10, 5, 64, 8, 12, 8, 5, 20, 0,
+ 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20, 99,
+ 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116,
+ 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 0, 2, 1, 2, 11, 1, 2,
+ 3, 3, 2, 2, 1, 2, 11, 3, 2, 3, 3, 4, 2, 1, 2, 11, 5, 2,
+ 3, 3, 0, 1, 4, 0, 8, 118, 11, 3, 11, 4, 9, 73, 0, 0, 0, 0,
+ 56, 0, 12, 7, 6, 210, 4, 0, 0, 0, 0, 0, 0, 12, 8, 6, 210, 4,
+ 0, 0, 0, 0, 0, 0, 12, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 10, 9, 12, 6, 5, 16, 5, 47, 10, 6, 4, 115, 11, 10, 6, 1, 0, 0,
+ 0, 0, 0, 0, 0, 22, 12, 10, 10, 10, 10, 1, 35, 3, 27, 5, 47, 10,
+ 8, 12, 11, 13, 7, 10, 11, 11, 11, 56, 1, 11, 8, 6, 177, 30, 4, 0,
+ 0, 0, 0, 0, 22, 12, 8, 10, 8, 6, 64, 66, 15, 0, 0, 0, 0, 0,
+ 36, 3, 42, 5, 14, 11, 8, 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12,
+ 8, 5, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 11, 9, 12, 12, 11,
+ 2, 12, 13, 5, 55, 5, 105, 10, 12, 4, 112, 11, 11, 6, 1, 0, 0, 0,
+ 0, 0, 0, 0, 22, 12, 11, 10, 11, 10, 13, 35, 3, 66, 5, 105, 10, 8,
+ 12, 14, 13, 7, 10, 14, 11, 14, 56, 1, 10, 9, 12, 15, 13, 7, 14, 15,
+ 56, 2, 1, 11, 8, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 8, 10,
+ 8, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 87, 5, 91, 11, 8, 6,
+ 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 8, 11, 9, 6, 177, 30, 4, 0,
+ 0, 0, 0, 0, 22, 12, 9, 10, 9, 6, 64, 66, 15, 0, 0, 0, 0, 0,
+ 36, 3, 100, 5, 53, 11, 9, 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12,
+ 9, 5, 53, 11, 7, 18, 0, 12, 17, 11, 0, 11, 17, 45, 0, 2, 8, 12,
+ 12, 5, 61, 8, 12, 6, 5, 22, 4, 1, 4, 0, 13, 114, 56, 3, 12, 3,
+ 6, 210, 4, 0, 0, 0, 0, 0, 0, 12, 4, 6, 210, 4, 0, 0, 0, 0,
+ 0, 0, 12, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 9, 12, 7,
+ 5, 12, 5, 43, 10, 7, 4, 111, 11, 6, 6, 1, 0, 0, 0, 0, 0, 0,
+ 0, 22, 12, 6, 10, 6, 10, 1, 35, 3, 23, 5, 43, 10, 4, 12, 8, 13,
+ 3, 10, 8, 11, 8, 56, 4, 11, 4, 6, 177, 30, 4, 0, 0, 0, 0, 0,
+ 22, 12, 4, 10, 4, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 38, 5,
+ 10, 11, 4, 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 4, 5, 10, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 8, 9, 12, 9, 11, 2, 12, 10, 5,
+ 51, 5, 101, 10, 9, 4, 108, 11, 8, 6, 1, 0, 0, 0, 0, 0, 0, 0,
+ 22, 12, 8, 10, 8, 10, 10, 35, 3, 62, 5, 101, 10, 4, 12, 11, 13, 3,
+ 10, 11, 11, 11, 56, 4, 10, 5, 12, 12, 13, 3, 14, 12, 56, 5, 1, 11,
+ 4, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 4, 10, 4, 6, 64, 66,
+ 15, 0, 0, 0, 0, 0, 36, 3, 83, 5, 87, 11, 4, 6, 64, 66, 15, 0,
+ 0, 0, 0, 0, 23, 12, 4, 11, 5, 6, 177, 30, 4, 0, 0, 0, 0, 0,
+ 22, 12, 5, 10, 5, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 96, 5,
+ 49, 11, 5, 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 5, 5, 49, 11,
+ 3, 18, 1, 12, 14, 11, 0, 11, 14, 45, 1, 2, 8, 12, 9, 5, 57, 8,
+ 12, 7, 5, 18, 8, 1, 4, 0, 18, 115, 56, 6, 12, 3, 6, 210, 4, 0,
+ 0, 0, 0, 0, 0, 12, 4, 6, 210, 4, 0, 0, 0, 0, 0, 0, 12, 5,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 9, 12, 7, 5, 12, 5, 43,
+ 10, 7, 4, 112, 11, 6, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 6,
+ 10, 6, 10, 1, 35, 3, 23, 5, 43, 10, 4, 12, 8, 13, 3, 10, 8, 11,
+ 8, 56, 7, 11, 4, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 4, 10,
+ 4, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 38, 5, 10, 11, 4, 6,
+ 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 4, 5, 10, 6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12, 8, 9, 12, 9, 11, 2, 12, 10, 5, 51, 5, 102, 10,
+ 9, 4, 109, 11, 8, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 8, 10,
+ 8, 10, 10, 35, 3, 62, 5, 102, 10, 4, 12, 11, 13, 3, 10, 11, 11, 11,
+ 56, 7, 10, 5, 12, 12, 13, 3, 14, 12, 56, 8, 1, 1, 11, 4, 6, 177,
+ 30, 4, 0, 0, 0, 0, 0, 22, 12, 4, 10, 4, 6, 64, 66, 15, 0, 0,
+ 0, 0, 0, 36, 3, 84, 5, 88, 11, 4, 6, 64, 66, 15, 0, 0, 0, 0,
+ 0, 23, 12, 4, 11, 5, 6, 177, 30, 4, 0, 0, 0, 0, 0, 22, 12, 5,
+ 10, 5, 6, 64, 66, 15, 0, 0, 0, 0, 0, 36, 3, 97, 5, 49, 11, 5,
+ 6, 64, 66, 15, 0, 0, 0, 0, 0, 23, 12, 5, 5, 49, 11, 3, 18, 2,
+ 12, 14, 11, 0, 11, 14, 45, 2, 2, 8, 12, 9, 5, 57, 8, 12, 7, 5,
+ 18, 0,
]
});