From 5fc6b74c89260cc2d39569296a0bff8d35414d96 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Mon, 27 Jul 2020 12:41:50 -0700 Subject: [PATCH] ADDED: Remove unused pads This option removes copper layers from pads and vias where they are not connected to other board elements. This allows the inner layers to be more closely routed if the via landing pad is not needed. Fixes https://gitlab.com/kicad/code/kicad/issues/1835 --- bitmaps_png/CMakeLists.txt | 4 + bitmaps_png/cpp_26/pads_remove.cpp | 60 ++ bitmaps_png/cpp_other/pads_remove_unused.cpp | 174 ++++++ .../pads_remove_unused_keep_bottom.cpp | 208 +++++++ bitmaps_png/cpp_other/pads_reset_unused.cpp | 263 +++++++++ .../include/bitmaps_png/bitmaps_list.h | 4 + bitmaps_png/sources/pads_remove.svg | 407 +++++++++++++ bitmaps_png/sources/pads_remove_unused.svg | 407 +++++++++++++ .../pads_remove_unused_keep_bottom.svg | 407 +++++++++++++ bitmaps_png/sources/pads_reset_unused.svg | 406 +++++++++++++ common/pcb.keywords | 4 +- pcbnew/CMakeLists.txt | 2 + pcbnew/class_pad.cpp | 42 ++ pcbnew/class_pad.h | 20 + pcbnew/class_track.cpp | 44 ++ pcbnew/class_track.h | 34 +- pcbnew/connectivity/connectivity_algo.h | 4 +- pcbnew/connectivity/connectivity_data.cpp | 20 + pcbnew/connectivity/connectivity_data.h | 2 + pcbnew/dialogs/dialog_unused_pad_layers.cpp | 157 +++++ pcbnew/dialogs/dialog_unused_pad_layers.fbp | 556 ++++++++++++++++++ pcbnew/dialogs/dialog_unused_pad_layers.h | 55 ++ .../dialogs/dialog_unused_pad_layers_base.cpp | 112 ++++ .../dialogs/dialog_unused_pad_layers_base.h | 63 ++ pcbnew/drc/drc_clearance_test_functions.cpp | 15 + pcbnew/kicad_plugin.cpp | 19 + pcbnew/kicad_plugin.h | 3 +- pcbnew/menubar_pcb_editor.cpp | 3 + pcbnew/pcb_painter.cpp | 56 +- pcbnew/pcb_parser.cpp | 20 + pcbnew/plot_board_layers.cpp | 8 + pcbnew/router/pns_kicad_iface.cpp | 43 +- pcbnew/router/pns_kicad_iface.h | 4 +- pcbnew/router/pns_via.h | 7 - pcbnew/tools/global_edit_tool.cpp | 20 +- pcbnew/tools/global_edit_tool.h | 1 + pcbnew/tools/pcb_actions.cpp | 6 + pcbnew/tools/pcb_actions.h | 1 + pcbnew/zone_filler.cpp | 22 +- 39 files changed, 3634 insertions(+), 49 deletions(-) create mode 100644 bitmaps_png/cpp_26/pads_remove.cpp create mode 100644 bitmaps_png/cpp_other/pads_remove_unused.cpp create mode 100644 bitmaps_png/cpp_other/pads_remove_unused_keep_bottom.cpp create mode 100644 bitmaps_png/cpp_other/pads_reset_unused.cpp create mode 100644 bitmaps_png/sources/pads_remove.svg create mode 100644 bitmaps_png/sources/pads_remove_unused.svg create mode 100644 bitmaps_png/sources/pads_remove_unused_keep_bottom.svg create mode 100644 bitmaps_png/sources/pads_reset_unused.svg create mode 100644 pcbnew/dialogs/dialog_unused_pad_layers.cpp create mode 100644 pcbnew/dialogs/dialog_unused_pad_layers.fbp create mode 100644 pcbnew/dialogs/dialog_unused_pad_layers.h create mode 100644 pcbnew/dialogs/dialog_unused_pad_layers_base.cpp create mode 100644 pcbnew/dialogs/dialog_unused_pad_layers_base.h diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt index 79d2b3118e..7cb83b1b8b 100644 --- a/bitmaps_png/CMakeLists.txt +++ b/bitmaps_png/CMakeLists.txt @@ -381,6 +381,7 @@ set( BMAPS_MID pad_enumerate pad_number pads_mask_layers + pads_remove path pagelayout_load pagelayout_normal_view_mode @@ -556,6 +557,9 @@ set( BMAPS_BIG ) set( BMAPS_OTHER + pads_remove_unused + pads_remove_unused_keep_bottom + pads_reset_unused stroke_dash stroke_dashdot stroke_dot diff --git a/bitmaps_png/cpp_26/pads_remove.cpp b/bitmaps_png/cpp_26/pads_remove.cpp new file mode 100644 index 0000000000..a065f8a792 --- /dev/null +++ b/bitmaps_png/cpp_26/pads_remove.cpp @@ -0,0 +1,60 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x02, 0xb2, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xe5, 0x55, 0x4b, 0x4f, 0x53, + 0x61, 0x10, 0xfd, 0x4a, 0x5f, 0x50, 0x62, 0xa9, 0x09, 0x94, 0x10, 0x53, 0x5a, 0x0a, 0xa1, 0xcd, + 0xe5, 0xa5, 0x48, 0x4a, 0xe8, 0x8a, 0x94, 0x0d, 0x2c, 0xc4, 0xbd, 0xee, 0xd4, 0x18, 0x11, 0x37, + 0xfe, 0x02, 0xfb, 0x14, 0xe4, 0x51, 0x0a, 0xa5, 0x22, 0x09, 0x0d, 0x08, 0x26, 0xec, 0x5c, 0x91, + 0xf0, 0x0b, 0x94, 0x8d, 0x61, 0xe1, 0x42, 0x34, 0x08, 0x6e, 0x54, 0x76, 0x4a, 0x43, 0x0b, 0x8d, + 0xd0, 0x3b, 0x9e, 0xb9, 0x52, 0x22, 0x55, 0x11, 0x8c, 0x90, 0x28, 0x93, 0x9c, 0xdc, 0xc9, 0x77, + 0x67, 0xe6, 0x7c, 0x77, 0xd2, 0x9e, 0x23, 0xc4, 0xaf, 0xc2, 0x2b, 0x24, 0xe0, 0x86, 0xda, 0xab, + 0x1e, 0xd3, 0x05, 0x75, 0x0b, 0x5a, 0xbf, 0x76, 0x59, 0xe3, 0xd7, 0x7c, 0x54, 0xfb, 0xd4, 0x9f, + 0x19, 0xc8, 0x3f, 0xf0, 0x99, 0x2e, 0xa0, 0x5b, 0xe0, 0x1a, 0xae, 0x55, 0x7a, 0x0e, 0x1d, 0x3e, + 0x71, 0x19, 0x03, 0x5e, 0x63, 0x40, 0xb2, 0x6c, 0xb0, 0x2c, 0xe9, 0x8c, 0x39, 0xa9, 0x69, 0xa2, + 0x89, 0xdc, 0x53, 0x6e, 0x6a, 0x99, 0x6c, 0xa1, 0xda, 0xf1, 0x5a, 0x92, 0x1e, 0x4a, 0xd4, 0x30, + 0xde, 0x40, 0x8d, 0x13, 0x8d, 0x54, 0xf7, 0xa8, 0x8e, 0x2a, 0xa3, 0x95, 0x64, 0xee, 0x37, 0xa7, + 0xb4, 0x01, 0x6d, 0x0a, 0x97, 0x58, 0x11, 0x7e, 0x71, 0x13, 0xa4, 0xf6, 0x3d, 0xf4, 0x8a, 0xa2, + 0xfd, 0x24, 0x41, 0x71, 0x4e, 0xed, 0x57, 0x6f, 0xba, 0x26, 0x5c, 0xd4, 0x3e, 0xdb, 0x4e, 0x1d, + 0xb3, 0x1d, 0x7b, 0xc0, 0xc0, 0x4d, 0x95, 0x57, 0x25, 0x8b, 0x7b, 0x82, 0xd0, 0x7c, 0x54, 0x7c, + 0xca, 0x5d, 0x57, 0x3e, 0x88, 0xde, 0x97, 0x0e, 0x94, 0x26, 0x73, 0xc9, 0x9a, 0xe3, 0xcd, 0xb2, + 0xb1, 0xc7, 0xb8, 0x91, 0xe7, 0xcb, 0x93, 0x55, 0x3e, 0x15, 0x23, 0x83, 0x95, 0xca, 0x86, 0x90, + 0x81, 0xb2, 0xd0, 0x07, 0xf5, 0x84, 0x7e, 0x19, 0x73, 0xb6, 0xb1, 0x99, 0x55, 0x3c, 0x57, 0x80, + 0xb7, 0xc0, 0xd3, 0x1f, 0x57, 0x87, 0xcf, 0xc4, 0xb0, 0x6e, 0xac, 0x6f, 0x09, 0x5f, 0xb0, 0x6d, + 0x08, 0x1a, 0x12, 0xe6, 0x41, 0x73, 0xc2, 0x12, 0xb1, 0x6c, 0xd9, 0x47, 0xec, 0x3b, 0x8e, 0x51, + 0x07, 0x55, 0xc7, 0xaa, 0x89, 0x73, 0x4b, 0xd8, 0xb2, 0x65, 0x1e, 0x30, 0x27, 0xf2, 0x83, 0xf9, + 0x09, 0xae, 0x45, 0xcf, 0x2b, 0xf4, 0x76, 0x61, 0xb0, 0x51, 0x1c, 0x29, 0x46, 0x84, 0x1e, 0x4d, + 0xe7, 0x81, 0x2b, 0xb8, 0x61, 0x97, 0x7d, 0xd8, 0xfe, 0xa0, 0xa8, 0xa7, 0x88, 0x4c, 0xbd, 0x26, + 0xb2, 0x45, 0x6c, 0xbd, 0x7c, 0xa6, 0xbc, 0xfb, 0x56, 0xa3, 0x13, 0x7f, 0x2b, 0xd2, 0xe9, 0xb4, + 0xdd, 0x3a, 0x64, 0xa5, 0x8a, 0xe1, 0x0a, 0x99, 0x88, 0xac, 0xe2, 0xb8, 0x02, 0xc3, 0x6d, 0x35, + 0xb1, 0x1a, 0x92, 0x62, 0x12, 0x71, 0x7e, 0x9c, 0x44, 0xa6, 0x99, 0x97, 0x33, 0x33, 0xc0, 0x13, + 0xe4, 0x67, 0x8f, 0x8d, 0xe8, 0xc4, 0x56, 0xf7, 0xff, 0x11, 0x9d, 0xe4, 0x8f, 0xe1, 0xcc, 0xfc, + 0xf2, 0x7c, 0x78, 0x6e, 0x79, 0x6e, 0x88, 0xf3, 0x7f, 0x6c, 0x75, 0x5e, 0xe1, 0xc4, 0x3f, 0xff, + 0x3a, 0xd4, 0x78, 0x14, 0x4a, 0xfe, 0x1c, 0xf2, 0xf2, 0xc6, 0x39, 0xea, 0x5c, 0x53, 0x88, 0x22, + 0x15, 0xe4, 0x88, 0x3a, 0xd6, 0xf8, 0x0c, 0x7a, 0xf7, 0x0c, 0xfa, 0x16, 0x45, 0xfd, 0x35, 0xa5, + 0xe7, 0x80, 0x81, 0x46, 0xc8, 0xfa, 0xc5, 0x3d, 0x04, 0xc4, 0x5d, 0x34, 0xae, 0x6a, 0x02, 0x9a, + 0xcd, 0xe2, 0xbe, 0xe2, 0x94, 0x6d, 0xd8, 0x46, 0xd2, 0x98, 0x44, 0xf5, 0xe3, 0xf5, 0xd4, 0x36, + 0xdd, 0x46, 0x59, 0xa2, 0xce, 0xd9, 0x4e, 0x72, 0x4f, 0xba, 0x15, 0x0b, 0x61, 0x2b, 0x81, 0xa5, + 0x6c, 0xc0, 0x26, 0x92, 0xac, 0x77, 0xb8, 0xe0, 0xa5, 0x9f, 0x11, 0xbd, 0x3b, 0xac, 0xdc, 0x33, + 0x41, 0x96, 0x88, 0x9f, 0x55, 0xd1, 0xaa, 0xf4, 0xf7, 0x56, 0xc2, 0x6a, 0xcf, 0xc4, 0x6c, 0x35, + 0x22, 0x24, 0xca, 0x72, 0x89, 0xd8, 0x1d, 0x5f, 0xec, 0x62, 0x11, 0x2a, 0xfc, 0x05, 0xb7, 0xca, + 0x14, 0x86, 0x0a, 0x09, 0xb6, 0x40, 0x2c, 0xa2, 0x0c, 0xd8, 0x80, 0x5c, 0x10, 0x2a, 0xd8, 0xf1, + 0x3c, 0xf6, 0x64, 0x3c, 0x53, 0x9e, 0x4c, 0x49, 0x7f, 0x49, 0xaa, 0x75, 0xba, 0x75, 0x1f, 0x89, + 0x2b, 0xee, 0x22, 0xb6, 0x18, 0xb6, 0x1a, 0x45, 0x90, 0x0f, 0x0c, 0xb6, 0x09, 0x7f, 0xde, 0x1d, + 0x76, 0x59, 0xc5, 0x26, 0xee, 0x1b, 0xd6, 0xd1, 0x9c, 0x28, 0x8f, 0x94, 0xb3, 0x4d, 0x64, 0x1c, + 0x31, 0x07, 0x31, 0x38, 0xe7, 0x33, 0xb6, 0x10, 0x5c, 0x62, 0x7d, 0xd7, 0x26, 0x96, 0xd0, 0x7b, + 0xfb, 0xcf, 0x6c, 0xc2, 0x2f, 0x2e, 0x60, 0xe7, 0x57, 0x81, 0x6e, 0x6b, 0xd8, 0xda, 0x97, 0x63, + 0x13, 0xdd, 0xca, 0x3b, 0xae, 0xf9, 0xed, 0x17, 0x9c, 0x76, 0x09, 0xd2, 0xc7, 0x17, 0xe3, 0xb7, + 0x18, 0x9c, 0x8b, 0x53, 0x1d, 0x5f, 0x01, 0xf4, 0xbb, 0xc2, 0x3a, 0x41, 0xf8, 0xc5, 0xf2, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pads_remove_xpm[1] = {{ png, sizeof( png ), "pads_remove_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_other/pads_remove_unused.cpp b/bitmaps_png/cpp_other/pads_remove_unused.cpp new file mode 100644 index 0000000000..e03cad22c9 --- /dev/null +++ b/bitmaps_png/cpp_other/pads_remove_unused.cpp @@ -0,0 +1,174 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x96, 0x08, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x71, + 0xe2, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x55, 0x2d, 0x00, 0x00, 0x55, + 0x2d, 0x01, 0x6a, 0xe7, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x00, 0x52, 0x74, + 0x45, 0x58, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x43, 0x43, 0x20, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x41, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x62, 0x79, 0x2d, 0x73, 0x61, + 0x2f, 0x34, 0x2e, 0x30, 0x2f, 0xc3, 0x54, 0x62, 0x05, 0x00, 0x00, 0x09, 0x31, 0x49, 0x44, 0x41, + 0x54, 0x78, 0x9c, 0xed, 0xdd, 0x7d, 0x8c, 0x1c, 0x75, 0x1d, 0xc7, 0xf1, 0xf7, 0x6f, 0xf6, 0xe1, + 0x7a, 0xcf, 0xbd, 0x72, 0xd4, 0x52, 0xb0, 0x14, 0xaf, 0x0f, 0x16, 0xc1, 0xb4, 0x8a, 0x7d, 0x10, + 0x1a, 0x9b, 0x88, 0xf8, 0x47, 0xd3, 0x14, 0x2d, 0x0f, 0x41, 0x34, 0x20, 0x31, 0x6a, 0x62, 0xd0, + 0x40, 0x43, 0x78, 0xb0, 0x25, 0x63, 0x4b, 0x72, 0x1a, 0xff, 0x20, 0xa9, 0x8d, 0x06, 0xf9, 0x43, + 0x4c, 0x20, 0xa0, 0x92, 0x00, 0x06, 0x48, 0x11, 0x42, 0x1a, 0xb1, 0x55, 0x8f, 0x5a, 0x1a, 0x44, + 0x4b, 0x6b, 0x4f, 0xe8, 0x95, 0x87, 0x4b, 0x7b, 0x57, 0x5a, 0xae, 0x77, 0x7b, 0xb7, 0x7b, 0x3b, + 0x3f, 0xff, 0xd8, 0x23, 0x1c, 0xbb, 0x53, 0x6f, 0x9f, 0x86, 0xd9, 0xd9, 0xfd, 0xbc, 0x92, 0xfd, + 0xe3, 0x6e, 0x27, 0xb3, 0xdf, 0x9d, 0x7c, 0x66, 0xe6, 0xb7, 0x33, 0xbf, 0xdf, 0x6f, 0x40, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x1a, 0x97, 0x09, 0xbb, 0x80, 0x9a, 0xf2, 0x00, 0x09, 0x86, 0xe8, + 0x26, 0x4b, 0x37, 0x90, 0xc4, 0xa3, 0x09, 0x68, 0x99, 0x7a, 0xb7, 0x0d, 0x83, 0xc5, 0x32, 0x0a, + 0x80, 0x43, 0x0a, 0x18, 0x07, 0xd2, 0xc4, 0x18, 0xa2, 0x9b, 0x21, 0xbe, 0x47, 0x26, 0x9c, 0xc2, + 0x6b, 0x4f, 0x63, 0x05, 0xcb, 0xa5, 0x03, 0xb8, 0x18, 0x43, 0x0f, 0xb0, 0x08, 0x4b, 0x0f, 0xf0, + 0x29, 0xe0, 0x5c, 0x60, 0x2e, 0x30, 0xbb, 0xc2, 0x4f, 0x38, 0x05, 0x1c, 0x07, 0x4e, 0x00, 0xfd, + 0x40, 0x3f, 0x86, 0x7e, 0x2c, 0xfd, 0x34, 0xf3, 0x2f, 0xee, 0x64, 0xa4, 0xc2, 0xf5, 0x47, 0x46, + 0x7d, 0x07, 0x6b, 0x3b, 0xcb, 0xf0, 0x58, 0x87, 0x65, 0x25, 0xb0, 0x12, 0xf8, 0x34, 0xe0, 0x84, + 0x54, 0x8d, 0x07, 0x1c, 0x04, 0xfa, 0xa6, 0x5e, 0x2f, 0xe2, 0x72, 0x38, 0xa4, 0x5a, 0x02, 0x57, + 0x7f, 0xc1, 0xda, 0xc6, 0x2a, 0x3c, 0x36, 0x01, 0x1b, 0x81, 0x25, 0x61, 0x97, 0x33, 0x83, 0xd7, + 0x81, 0xa7, 0x80, 0xc7, 0x71, 0xd9, 0x17, 0x76, 0x31, 0xd5, 0x54, 0x3f, 0xc1, 0x72, 0xb9, 0x12, + 0xf8, 0x09, 0xf0, 0xc5, 0xb0, 0x4b, 0x29, 0xd3, 0x21, 0x0c, 0x4f, 0x62, 0xd9, 0x8f, 0xc1, 0x86, + 0x5d, 0x4c, 0xd1, 0x2c, 0x29, 0x1c, 0x46, 0x88, 0xf3, 0x1a, 0xf7, 0x30, 0xfc, 0xc1, 0xbf, 0xa3, + 0x1f, 0xac, 0xed, 0x2c, 0x25, 0xcb, 0x6f, 0x81, 0x55, 0x61, 0x97, 0xd2, 0xe0, 0x32, 0xc0, 0xe3, + 0x24, 0xd8, 0xcc, 0x8f, 0x79, 0x37, 0xda, 0xc1, 0x72, 0x59, 0x0d, 0x3c, 0x07, 0x74, 0x54, 0x75, + 0xbd, 0x96, 0x7a, 0xd8, 0xe5, 0xc2, 0xf2, 0x16, 0xf0, 0xa5, 0xe8, 0x6e, 0xbe, 0x5e, 0xba, 0x98, + 0xe0, 0x10, 0xb9, 0x5f, 0x74, 0x52, 0x5b, 0xfe, 0x1e, 0xd6, 0x2f, 0xa4, 0xca, 0x4d, 0xb0, 0x19, + 0x85, 0xaa, 0x56, 0xad, 0x8a, 0x6e, 0xb0, 0x60, 0x6d, 0xd8, 0x05, 0xc8, 0xd9, 0x45, 0x39, 0x58, + 0x73, 0xaa, 0xbe, 0xc6, 0xe8, 0xfc, 0x16, 0xab, 0x79, 0x51, 0x0e, 0xd6, 0xab, 0x55, 0x5f, 0x63, + 0x74, 0x5b, 0x9c, 0x35, 0x27, 0xca, 0xc1, 0x7a, 0x30, 0xec, 0x02, 0xe4, 0xec, 0x62, 0x61, 0x17, + 0x50, 0xb6, 0xdd, 0xbc, 0xc9, 0x3a, 0xba, 0xc9, 0xdd, 0xaa, 0x91, 0xda, 0xf2, 0x7c, 0x74, 0x83, + 0x05, 0xb0, 0x9b, 0x5d, 0xac, 0xa3, 0x19, 0x58, 0x83, 0x4e, 0x64, 0xb5, 0xe2, 0x20, 0x70, 0x75, + 0xb4, 0x83, 0x05, 0xb0, 0x9b, 0x17, 0x58, 0xc7, 0x8b, 0xc0, 0x42, 0xe0, 0xa2, 0xaa, 0xae, 0x5b, + 0x17, 0x4a, 0x4b, 0x71, 0x1a, 0xf8, 0x15, 0xb3, 0xf8, 0x16, 0x5b, 0x18, 0xae, 0xaf, 0xcd, 0x96, + 0xbb, 0x01, 0x7d, 0x1b, 0xb0, 0x1e, 0x68, 0x0b, 0xbb, 0x9c, 0x22, 0x8d, 0x01, 0x7f, 0xc6, 0xe1, + 0x11, 0x72, 0x7b, 0x7b, 0xf4, 0x78, 0xa4, 0x38, 0x8f, 0xff, 0x4c, 0xef, 0x8f, 0x56, 0x5f, 0xc1, + 0xfa, 0x80, 0xcb, 0x2c, 0x0c, 0x5f, 0xc6, 0xb2, 0x11, 0x58, 0x07, 0x2c, 0x0e, 0xb9, 0xa2, 0xe9, + 0x2c, 0x70, 0x18, 0xd8, 0x8d, 0xe1, 0x29, 0xba, 0x78, 0x91, 0x1f, 0x32, 0x11, 0x76, 0x51, 0xd5, + 0x56, 0x9f, 0xc1, 0xca, 0xd7, 0x4b, 0x17, 0xe9, 0xa9, 0x3e, 0x59, 0x96, 0xcf, 0x00, 0x8b, 0x80, + 0x1e, 0x2a, 0xef, 0xd8, 0x37, 0x93, 0x53, 0xc0, 0x11, 0x72, 0x1d, 0xfe, 0xfe, 0x09, 0xf4, 0x61, + 0x79, 0x19, 0x97, 0x53, 0x01, 0x7f, 0x6e, 0xe8, 0x1a, 0x23, 0x58, 0x67, 0xe3, 0xd2, 0x8d, 0x43, + 0x0f, 0x96, 0xb9, 0x40, 0x37, 0xd0, 0xbd, 0x61, 0xc9, 0x86, 0xaf, 0x77, 0x36, 0x75, 0xae, 0x7c, + 0xf8, 0xd5, 0x87, 0x8b, 0xba, 0x14, 0x73, 0xf3, 0xf2, 0x9b, 0xed, 0xf1, 0x33, 0xc7, 0xff, 0xf2, + 0xec, 0x91, 0x67, 0xff, 0x08, 0x0c, 0x4d, 0xbd, 0x8e, 0x93, 0xa4, 0x7f, 0x7a, 0x37, 0x92, 0x46, + 0xd3, 0xd8, 0xc1, 0xf2, 0x61, 0xad, 0xdd, 0x36, 0x92, 0x1e, 0xb9, 0xbb, 0xa3, 0xb7, 0x23, 0x5e, + 0xcc, 0xf2, 0xe9, 0xad, 0x69, 0x2f, 0xe1, 0x24, 0xb6, 0x18, 0x63, 0x7a, 0x83, 0xae, 0x2d, 0x4a, + 0xa2, 0x7c, 0x81, 0x54, 0x6a, 0x98, 0x82, 0x25, 0x81, 0x50, 0xb0, 0xfc, 0x58, 0x35, 0x11, 0x2a, + 0xa5, 0x60, 0x15, 0x2a, 0xa9, 0x8f, 0x83, 0xb5, 0x16, 0xd4, 0x56, 0x2d, 0xa0, 0x60, 0x49, 0x20, + 0x14, 0x2c, 0x09, 0x84, 0x82, 0xe5, 0xc3, 0x18, 0x9d, 0xd9, 0x2a, 0xa5, 0x60, 0x15, 0x52, 0x1b, + 0xab, 0x0a, 0x14, 0x2c, 0x09, 0x84, 0x82, 0x25, 0x81, 0x50, 0xb0, 0x7c, 0x18, 0x9d, 0xd9, 0x2a, + 0xa6, 0x60, 0x55, 0xc8, 0xa2, 0x36, 0x96, 0x1f, 0x05, 0x4b, 0x02, 0xa1, 0x60, 0x49, 0x20, 0x14, + 0x2c, 0x09, 0x84, 0x82, 0x55, 0xc8, 0x96, 0x71, 0x81, 0x54, 0x6d, 0xac, 0x3c, 0x0a, 0x56, 0xe5, + 0x34, 0x30, 0xdf, 0x87, 0x82, 0x25, 0x81, 0x50, 0xb0, 0x0a, 0xd9, 0x44, 0x2c, 0x61, 0xae, 0x58, + 0x70, 0x05, 0x6d, 0xc9, 0xb3, 0x8f, 0x20, 0xeb, 0x9a, 0xd5, 0xc5, 0xfa, 0xc5, 0xeb, 0x89, 0x39, + 0x31, 0x83, 0x4e, 0x85, 0x05, 0x8a, 0xea, 0xd7, 0xdd, 0x60, 0x0e, 0xc4, 0x4c, 0x6c, 0xfc, 0xa5, + 0x6f, 0xbf, 0xd4, 0x02, 0x30, 0x32, 0x31, 0x92, 0x3d, 0x93, 0x39, 0xe3, 0x8d, 0x65, 0xc6, 0x48, + 0x67, 0xd3, 0xb4, 0x26, 0x5b, 0x69, 0x4f, 0xb4, 0x9b, 0xd9, 0xcd, 0xb3, 0x63, 0x06, 0x63, 0xb2, + 0x5e, 0x36, 0x05, 0x1c, 0x08, 0xb9, 0xe6, 0x9a, 0xa3, 0x3d, 0xcd, 0x87, 0xb5, 0xb6, 0x89, 0xdc, + 0xb0, 0xfd, 0x65, 0xc0, 0xf9, 0xc0, 0x2c, 0xa0, 0x7d, 0xea, 0xed, 0x71, 0x20, 0x05, 0x1c, 0x05, + 0xf6, 0x00, 0xaf, 0x19, 0x63, 0xbc, 0x30, 0xea, 0x14, 0x69, 0x38, 0x3a, 0x62, 0xe5, 0xb1, 0xd6, + 0x2e, 0x07, 0xbe, 0x4f, 0x69, 0xdb, 0xe6, 0x09, 0x63, 0xcc, 0xae, 0x80, 0x4a, 0x8a, 0x24, 0xb5, + 0xb1, 0x0a, 0x6d, 0xb2, 0xd8, 0xef, 0x1e, 0x7b, 0xff, 0xd8, 0xe4, 0x4c, 0x0b, 0x8e, 0x4f, 0x8e, + 0xdb, 0xc5, 0x5d, 0x8b, 0x93, 0xc6, 0x98, 0x37, 0x00, 0x05, 0x6b, 0x1a, 0x05, 0xcb, 0xc7, 0xc8, + 0xc4, 0x48, 0xf6, 0xc2, 0xfb, 0x2f, 0x4c, 0x14, 0xb3, 0x6c, 0x66, 0x6b, 0xc6, 0x8b, 0x1b, 0x6d, + 0xc6, 0x7c, 0xba, 0xdc, 0x20, 0x81, 0x50, 0xb0, 0x24, 0x10, 0x0a, 0x96, 0x0f, 0xdd, 0x2b, 0xac, + 0x9c, 0x82, 0x55, 0xa8, 0xb4, 0xc1, 0x14, 0xba, 0x55, 0xe8, 0x4b, 0xc1, 0x92, 0x40, 0x28, 0x58, + 0x12, 0x08, 0x05, 0xcb, 0x4f, 0xe9, 0x93, 0x82, 0xa8, 0x8d, 0x95, 0x47, 0xc1, 0x2a, 0x54, 0xce, + 0x80, 0x55, 0xc9, 0xa3, 0x60, 0x49, 0x20, 0x14, 0x2c, 0x09, 0x84, 0x82, 0xe5, 0x43, 0x93, 0x82, + 0x54, 0x4e, 0xc1, 0x2a, 0xa4, 0x49, 0x41, 0xaa, 0x40, 0xc1, 0x92, 0x40, 0x28, 0x58, 0x12, 0x08, + 0x05, 0xcb, 0x87, 0x26, 0x05, 0xa9, 0x9c, 0x82, 0x55, 0x21, 0x4d, 0x0a, 0xe2, 0x4f, 0xc1, 0x92, + 0x40, 0x28, 0x58, 0x12, 0x08, 0x05, 0xab, 0x50, 0x39, 0x73, 0x37, 0x48, 0x1e, 0x05, 0xab, 0x72, + 0x7a, 0x0e, 0xab, 0x0f, 0x05, 0x4b, 0x02, 0xa1, 0x60, 0x49, 0x20, 0x34, 0x6e, 0xa9, 0x90, 0x4d, + 0x38, 0x09, 0xe7, 0x96, 0x15, 0xb7, 0x70, 0x60, 0xf0, 0x00, 0x03, 0xa7, 0x07, 0x48, 0x65, 0x52, + 0x8c, 0x66, 0x46, 0x01, 0x48, 0x38, 0x09, 0xda, 0x92, 0x6d, 0x2c, 0xed, 0x5e, 0xca, 0x9a, 0x0b, + 0xd6, 0x10, 0x77, 0xe2, 0x0e, 0x3a, 0x15, 0xca, 0x4c, 0xac, 0xb5, 0x97, 0xa7, 0xb3, 0xe9, 0x7f, + 0x5b, 0x1f, 0x9e, 0xe7, 0x7d, 0xf4, 0x6f, 0xeb, 0x4d, 0x66, 0xbc, 0xcc, 0x7e, 0x6b, 0xed, 0xe5, + 0x61, 0xd7, 0x5d, 0x6b, 0xb4, 0xa7, 0x9d, 0x85, 0xb5, 0xf6, 0x3c, 0x72, 0x93, 0x82, 0xcc, 0x03, + 0xda, 0x80, 0x0e, 0x20, 0x06, 0xbc, 0x07, 0x4c, 0x00, 0x03, 0x40, 0x9f, 0x31, 0x66, 0x34, 0xb4, + 0x22, 0x45, 0x1a, 0x8d, 0x8e, 0x58, 0x79, 0xac, 0xb5, 0x49, 0xe0, 0x12, 0x4a, 0xdb, 0x36, 0x6f, + 0x1b, 0x63, 0x06, 0x03, 0x2a, 0x49, 0xea, 0x81, 0xb5, 0xf6, 0x2e, 0xbf, 0xf6, 0xd5, 0x0c, 0xee, + 0x0a, 0xbb, 0xee, 0x5a, 0xa3, 0x5f, 0x85, 0x85, 0x5a, 0xc7, 0x32, 0x63, 0xd9, 0x8d, 0x8f, 0x6d, + 0x8c, 0x15, 0xb3, 0xf0, 0xae, 0x1b, 0x77, 0xd9, 0x98, 0x53, 0xd4, 0xa2, 0x0d, 0x45, 0xc1, 0xf2, + 0x31, 0xe9, 0x4d, 0xda, 0x17, 0xfe, 0xfb, 0x42, 0x51, 0xcb, 0x5a, 0x34, 0x4c, 0xc7, 0x8f, 0x2e, + 0x90, 0x4a, 0x20, 0x14, 0x2c, 0x1f, 0xba, 0x09, 0x5d, 0x39, 0x05, 0xab, 0x50, 0x39, 0x93, 0x82, + 0x28, 0x89, 0x79, 0x14, 0x2c, 0x09, 0x84, 0x82, 0x25, 0x81, 0x50, 0xb0, 0xfc, 0x94, 0x3e, 0x29, + 0x88, 0xe4, 0x51, 0xb0, 0x0a, 0x69, 0xc0, 0x6a, 0x15, 0x28, 0x58, 0x12, 0x08, 0x05, 0x4b, 0x02, + 0xa1, 0x60, 0xf9, 0xd0, 0x75, 0xac, 0xca, 0x29, 0x58, 0x85, 0xd4, 0xc6, 0xaa, 0x82, 0xc6, 0xbd, + 0x57, 0xe8, 0x32, 0x1f, 0x87, 0x1e, 0x2c, 0x0b, 0x81, 0x6e, 0x2c, 0xdd, 0xc0, 0xb9, 0x0f, 0xec, + 0x7b, 0x60, 0xed, 0x0d, 0x97, 0xde, 0x50, 0xf4, 0x0e, 0x67, 0xb1, 0x66, 0x67, 0xdf, 0xce, 0x6f, + 0xe0, 0xb2, 0x00, 0x38, 0x01, 0x0c, 0x61, 0x18, 0xc6, 0xf2, 0x06, 0x70, 0x04, 0x97, 0x86, 0xec, + 0x4e, 0x53, 0xff, 0xc1, 0xfa, 0x19, 0xed, 0xa4, 0xf8, 0x3c, 0x86, 0x55, 0x58, 0xbe, 0x00, 0x2c, + 0x01, 0x7a, 0x80, 0x16, 0x7c, 0x1e, 0x06, 0x37, 0x38, 0x3a, 0x58, 0xd2, 0x14, 0xdb, 0x16, 0x6b, + 0x06, 0xcf, 0x0c, 0x5e, 0x0c, 0x5c, 0x3c, 0xed, 0x9f, 0x1f, 0x72, 0x19, 0x05, 0xfa, 0x81, 0x43, + 0x40, 0x1f, 0xd0, 0x47, 0x2b, 0xff, 0xe0, 0x0e, 0xea, 0xba, 0xe7, 0x69, 0x3d, 0x06, 0xcb, 0xb0, + 0x8d, 0xcb, 0xf0, 0xb8, 0x1a, 0x58, 0x4f, 0x8a, 0x4b, 0x80, 0x58, 0x88, 0xd3, 0xb1, 0xb7, 0x02, + 0x9f, 0x9d, 0x7a, 0x5d, 0x0b, 0xc0, 0x28, 0x59, 0x5c, 0x5e, 0x05, 0x9e, 0xc6, 0xe1, 0x29, 0xee, + 0x65, 0x3f, 0x75, 0xf6, 0x6c, 0xe9, 0xfa, 0x09, 0x96, 0xcb, 0x5c, 0xe0, 0x47, 0xc0, 0x4d, 0x78, + 0x9c, 0x5f, 0xc9, 0xaa, 0x4a, 0x9d, 0x6d, 0xa6, 0x8c, 0xc6, 0x7e, 0x0c, 0x58, 0x01, 0xac, 0xc0, + 0x63, 0x2b, 0x2e, 0x03, 0xc0, 0x43, 0x24, 0xd9, 0xc1, 0x3d, 0x0c, 0x97, 0xba, 0xb2, 0x5a, 0xf4, + 0x61, 0xb0, 0x76, 0xd0, 0xc4, 0x7b, 0x7c, 0x07, 0xcb, 0x35, 0xc0, 0x52, 0x72, 0x4f, 0x15, 0x8d, + 0x02, 0x03, 0x34, 0x03, 0x49, 0x42, 0x68, 0x44, 0x57, 0x69, 0xd6, 0xe4, 0x05, 0xc0, 0xbd, 0xa4, + 0xb9, 0x1d, 0x97, 0x07, 0x81, 0xfb, 0x70, 0x39, 0x59, 0x8d, 0x15, 0x87, 0x25, 0x17, 0x2c, 0x97, + 0x85, 0x9c, 0xe4, 0x19, 0xa6, 0xb7, 0x13, 0x24, 0x0c, 0x6d, 0xc0, 0x6d, 0xc0, 0xf5, 0xb8, 0x5c, + 0x8b, 0xcb, 0xde, 0xb0, 0x0b, 0x2a, 0x97, 0xc3, 0xcf, 0x69, 0x25, 0xf7, 0x10, 0x47, 0x85, 0xaa, + 0x76, 0xcc, 0x07, 0x9e, 0xc3, 0xe5, 0xb2, 0xb0, 0x0b, 0x29, 0x97, 0xc3, 0x28, 0xb7, 0x92, 0x3b, + 0xf5, 0x09, 0xb9, 0x53, 0x5b, 0x8d, 0x5c, 0x20, 0x6d, 0x03, 0x7e, 0xcd, 0xef, 0x89, 0x64, 0x87, + 0x7a, 0x07, 0xb8, 0x3e, 0xec, 0x22, 0xa2, 0xcc, 0x62, 0x3f, 0x6c, 0xec, 0x17, 0xdb, 0xdc, 0x2a, + 0xbe, 0x59, 0xb6, 0x82, 0xd7, 0x59, 0x59, 0x7a, 0x55, 0xe1, 0x73, 0xd0, 0xd1, 0xaa, 0x7a, 0x8a, + 0x3d, 0xd0, 0x95, 0x72, 0x40, 0xb4, 0x2c, 0x2f, 0xa7, 0x94, 0xb0, 0x39, 0x40, 0x3a, 0xec, 0x22, + 0x6a, 0x89, 0xc5, 0x12, 0x33, 0x31, 0x9a, 0x62, 0x4d, 0x33, 0x2e, 0xdb, 0x9e, 0x6c, 0xc7, 0x60, + 0x82, 0x3d, 0x75, 0xda, 0x68, 0x5e, 0x7e, 0x88, 0x03, 0x2f, 0x03, 0x57, 0x86, 0x5d, 0x48, 0xad, + 0x38, 0x99, 0x3a, 0x49, 0x4b, 0xa2, 0x85, 0xe1, 0x3b, 0x87, 0x39, 0x78, 0xe2, 0x20, 0x03, 0xa7, + 0x07, 0x18, 0xcb, 0x8c, 0x31, 0x96, 0x19, 0x23, 0x6b, 0xb3, 0x24, 0x63, 0x49, 0x3a, 0x9a, 0x3a, + 0x58, 0x3c, 0x67, 0x31, 0x97, 0x7e, 0xe2, 0x52, 0x62, 0x26, 0xc6, 0xc9, 0x54, 0x60, 0x57, 0x06, + 0xb2, 0xc0, 0xdf, 0x82, 0x5a, 0x79, 0x90, 0x0c, 0x2e, 0xd7, 0x00, 0x7f, 0x08, 0xbb, 0x90, 0x5a, + 0xe1, 0x18, 0x87, 0xd5, 0x17, 0xac, 0xe6, 0xaa, 0x9e, 0xab, 0x58, 0xd6, 0xbd, 0x8c, 0x79, 0x6d, + 0xf3, 0x68, 0x4d, 0xb6, 0xd2, 0xd9, 0xd4, 0x89, 0x63, 0x1c, 0x4e, 0x4f, 0x9c, 0x66, 0x62, 0x72, + 0x82, 0xa3, 0xa7, 0x8e, 0xb2, 0xf7, 0xad, 0xbd, 0xec, 0x19, 0xd8, 0xc3, 0x2b, 0x83, 0xaf, 0xe0, + 0x59, 0x9f, 0xfb, 0x43, 0x7e, 0x4a, 0x9b, 0xff, 0xef, 0x97, 0xb8, 0xfc, 0xa0, 0xbc, 0x6f, 0x12, + 0xae, 0xdc, 0x57, 0x74, 0xf9, 0x1d, 0x70, 0x5d, 0xb8, 0xa5, 0x48, 0x9e, 0xe7, 0xe9, 0x60, 0x23, + 0xb7, 0x93, 0x0a, 0xbb, 0x90, 0x72, 0xe4, 0xee, 0xe2, 0x9f, 0xc7, 0x37, 0x81, 0x9d, 0xe0, 0x77, + 0x5b, 0x56, 0x3e, 0x66, 0x1e, 0x70, 0x3f, 0x73, 0xd8, 0x10, 0xd5, 0x50, 0x41, 0xfe, 0x41, 0xd9, + 0x65, 0x11, 0x86, 0xaf, 0x61, 0xe9, 0x29, 0x78, 0xaf, 0x96, 0x19, 0xba, 0xa6, 0x7e, 0x3d, 0xf5, + 0x10, 0x46, 0x1f, 0xb3, 0xea, 0x4c, 0x6f, 0x9b, 0x01, 0x1e, 0x23, 0x46, 0x2f, 0x5b, 0x39, 0x58, + 0xf1, 0xda, 0x42, 0x16, 0x9d, 0xf0, 0x14, 0x63, 0x3b, 0x17, 0x91, 0xe5, 0x46, 0xe0, 0x6a, 0xe0, + 0x73, 0xd4, 0xfe, 0xf7, 0xb3, 0xc0, 0x3e, 0x0c, 0x4f, 0x60, 0x79, 0x64, 0xea, 0x66, 0x74, 0x5d, + 0xa8, 0xf5, 0x0d, 0x5f, 0xbe, 0xfb, 0xf8, 0x24, 0x93, 0xac, 0x07, 0xd6, 0x00, 0x2b, 0xc9, 0x5d, + 0xaf, 0x0b, 0xfb, 0xfb, 0x7a, 0xc0, 0xeb, 0xe4, 0xfa, 0x65, 0xfd, 0x95, 0x38, 0xcf, 0xb0, 0x85, + 0xb7, 0x43, 0xae, 0x29, 0x10, 0x61, 0x6f, 0xe8, 0x8f, 0xcf, 0x4f, 0xe9, 0x64, 0xfc, 0x23, 0x1d, + 0xfd, 0x7a, 0x80, 0x45, 0xc0, 0x45, 0x40, 0x4b, 0x95, 0x3f, 0x6d, 0x14, 0xa6, 0x7a, 0x90, 0x42, + 0x3f, 0x86, 0x7e, 0x2c, 0x87, 0x80, 0x7d, 0xb8, 0xbc, 0x5f, 0xe5, 0xcf, 0xaa, 0x49, 0x8d, 0x13, + 0xac, 0xff, 0xc7, 0xa5, 0x85, 0x38, 0xe7, 0xe0, 0xd1, 0xbd, 0xe3, 0xab, 0x3b, 0xee, 0xe8, 0x6c, + 0xea, 0xbc, 0xee, 0xa6, 0x27, 0x6f, 0x2a, 0xea, 0x1e, 0xdd, 0xa3, 0x9b, 0x1e, 0xb5, 0xef, 0x8c, + 0xbc, 0xf3, 0x9b, 0xcd, 0x7f, 0xda, 0xfc, 0x0b, 0xe2, 0x0c, 0xd3, 0xc2, 0x50, 0x94, 0x1b, 0xdd, + 0xd5, 0xa2, 0x60, 0xe5, 0xb1, 0xd6, 0x6e, 0x1b, 0x49, 0x8f, 0xdc, 0xdd, 0xd1, 0xdb, 0x51, 0x54, + 0x27, 0xc8, 0xf4, 0xd6, 0xb4, 0x97, 0x70, 0x12, 0x5b, 0x8c, 0x31, 0xbd, 0x41, 0xd7, 0x16, 0x25, + 0x1a, 0xa5, 0x23, 0x81, 0x50, 0xb0, 0x24, 0x10, 0x0a, 0x96, 0x1f, 0x4d, 0x0a, 0x52, 0x31, 0x05, + 0xab, 0x90, 0x06, 0xac, 0x56, 0x81, 0x82, 0x25, 0x81, 0x50, 0xb0, 0x24, 0x10, 0x0a, 0x96, 0x04, + 0x42, 0xc1, 0xf2, 0x51, 0x46, 0x8f, 0x50, 0xb5, 0xb1, 0xf2, 0x28, 0x58, 0x85, 0xca, 0x69, 0xbc, + 0x4b, 0x1e, 0x05, 0x4b, 0x02, 0xa1, 0x60, 0x49, 0x20, 0x14, 0x2c, 0x1f, 0xa5, 0x4e, 0x0a, 0x82, + 0xda, 0x58, 0x05, 0x14, 0xac, 0x0a, 0x95, 0x32, 0x97, 0x56, 0x23, 0x51, 0xb0, 0x24, 0x10, 0x0a, + 0x96, 0x04, 0x42, 0xc1, 0x2a, 0x64, 0x6b, 0x64, 0x52, 0x90, 0x48, 0x53, 0xb0, 0x2a, 0x57, 0x9d, + 0x31, 0x3a, 0x75, 0x46, 0xc1, 0x92, 0x40, 0x28, 0x58, 0x85, 0x4a, 0x3a, 0x15, 0xea, 0x79, 0x85, + 0xfe, 0xea, 0x67, 0x72, 0xdb, 0xea, 0x49, 0x35, 0xc7, 0x9b, 0x63, 0x87, 0x6f, 0x3d, 0x3c, 0xb9, + 0xff, 0xdd, 0xfd, 0xf1, 0x63, 0xa7, 0x8f, 0xf9, 0x4e, 0x0a, 0xb2, 0xe4, 0x9c, 0x25, 0x76, 0xed, + 0x82, 0xb5, 0xd9, 0xe6, 0x78, 0x73, 0x1c, 0x34, 0x78, 0x22, 0x9f, 0xf6, 0xb4, 0x3c, 0xd6, 0xda, + 0x16, 0x60, 0x13, 0xf0, 0x95, 0x49, 0x3b, 0x79, 0x89, 0xb5, 0x76, 0xbe, 0xc1, 0xb4, 0xc4, 0x4c, + 0xac, 0xd5, 0x18, 0xe3, 0x4c, 0x7a, 0x93, 0x67, 0x80, 0x34, 0x86, 0x37, 0xe3, 0x26, 0xfe, 0x12, + 0xb0, 0x17, 0x78, 0xda, 0x18, 0x33, 0x16, 0x6a, 0xe1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x12, 0xb6, 0xff, 0x01, 0x70, 0xda, + 0xa4, 0xc4, 0xc6, 0xbc, 0xdf, 0x19, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, + 0x60, 0x82, +}; + +const BITMAP_OPAQUE pads_remove_unused_xpm[1] = {{ png, sizeof( png ), "pads_remove_unused_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_other/pads_remove_unused_keep_bottom.cpp b/bitmaps_png/cpp_other/pads_remove_unused_keep_bottom.cpp new file mode 100644 index 0000000000..112f9d0251 --- /dev/null +++ b/bitmaps_png/cpp_other/pads_remove_unused_keep_bottom.cpp @@ -0,0 +1,208 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x90, 0x08, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4d, 0xb9, + 0x35, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x55, 0x2d, 0x00, 0x00, 0x55, + 0x2d, 0x01, 0x6a, 0xe7, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x00, 0x52, 0x74, + 0x45, 0x58, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x43, 0x43, 0x20, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x41, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x62, 0x79, 0x2d, 0x73, 0x61, + 0x2f, 0x34, 0x2e, 0x30, 0x2f, 0xc3, 0x54, 0x62, 0x05, 0x00, 0x00, 0x0b, 0x5b, 0x49, 0x44, 0x41, + 0x54, 0x78, 0x9c, 0xed, 0xdd, 0x7d, 0x70, 0x54, 0xd5, 0x19, 0xc7, 0xf1, 0xef, 0xb9, 0xbb, 0x49, + 0xd8, 0x04, 0x12, 0x25, 0xc1, 0x60, 0x50, 0x50, 0x82, 0x26, 0x2d, 0x8a, 0xd6, 0x0a, 0xa8, 0xc0, + 0xd4, 0x56, 0x1c, 0x3b, 0x03, 0x1d, 0xb1, 0x3a, 0x82, 0xa5, 0xb6, 0xd5, 0xe9, 0x8c, 0x55, 0x8b, + 0xd6, 0x69, 0x67, 0x5a, 0x85, 0xb1, 0x47, 0x41, 0xdb, 0x3a, 0xc2, 0xb4, 0x53, 0xeb, 0x4b, 0x47, + 0xa5, 0xb4, 0x33, 0xb6, 0x6a, 0x5f, 0x18, 0x28, 0x5a, 0xdf, 0x2a, 0x76, 0x06, 0x6c, 0x03, 0x6d, + 0x81, 0xa9, 0xa2, 0x2d, 0x26, 0x4a, 0xd0, 0x20, 0x04, 0x94, 0x10, 0xc2, 0x26, 0xd9, 0xdd, 0xd3, + 0x3f, 0xee, 0x42, 0x30, 0xbb, 0x64, 0x5f, 0xc8, 0xdd, 0xb3, 0xf7, 0xee, 0xf3, 0x99, 0xd9, 0x3f, + 0x48, 0xce, 0xde, 0xfb, 0x10, 0x7e, 0xec, 0x9e, 0x7b, 0xf6, 0xdc, 0x27, 0x20, 0x84, 0x10, 0x42, + 0x08, 0x21, 0x82, 0x4e, 0xd9, 0x2e, 0xa0, 0x68, 0x68, 0x46, 0x00, 0x75, 0x38, 0xd4, 0x62, 0xa8, + 0xc3, 0x50, 0x81, 0xa2, 0x0a, 0x00, 0x43, 0x15, 0x50, 0x9e, 0x1c, 0x19, 0x45, 0x71, 0x38, 0xf9, + 0xf5, 0x83, 0x28, 0x7a, 0x51, 0x74, 0x12, 0xa2, 0x93, 0x3a, 0x3a, 0xb9, 0x89, 0x7e, 0x2b, 0xf5, + 0xfb, 0x50, 0x69, 0x85, 0x6f, 0x29, 0x67, 0x11, 0x67, 0x32, 0x8a, 0x46, 0x0c, 0x93, 0x80, 0x46, + 0xe0, 0x4c, 0x60, 0x2c, 0x30, 0x72, 0x98, 0xce, 0x72, 0x00, 0xe8, 0x00, 0xda, 0x80, 0x1d, 0xc7, + 0x3c, 0xb6, 0xa1, 0xd9, 0x35, 0x4c, 0xe7, 0x08, 0x84, 0xe0, 0x86, 0x4f, 0x13, 0x46, 0x31, 0x0b, + 0xc3, 0xe7, 0x80, 0x69, 0xc9, 0x47, 0xad, 0xe5, 0xaa, 0x3e, 0x00, 0x5a, 0x50, 0xb4, 0x60, 0x78, + 0x05, 0xcd, 0x26, 0xc0, 0x58, 0xae, 0xc9, 0x9a, 0x60, 0x85, 0xef, 0x19, 0x42, 0xbc, 0xc9, 0x97, + 0x80, 0x2f, 0x03, 0x73, 0x80, 0xd1, 0x96, 0x2b, 0xca, 0xe4, 0x03, 0x60, 0x0d, 0xf0, 0x2c, 0x9a, + 0xbf, 0xda, 0x2e, 0xa6, 0xd0, 0x82, 0x11, 0x3e, 0x4d, 0x39, 0xb0, 0x00, 0xb8, 0x0b, 0x68, 0xb2, + 0x5c, 0x4d, 0xbe, 0x76, 0x01, 0x2f, 0x01, 0x2d, 0x40, 0xc2, 0x72, 0x2d, 0xb9, 0x51, 0x7c, 0x84, + 0xe1, 0xf5, 0x5c, 0xa7, 0x15, 0xfe, 0x0f, 0x9f, 0xe6, 0x12, 0xe0, 0xd7, 0xb8, 0xf3, 0x37, 0x61, + 0x4f, 0x02, 0xf8, 0x13, 0x70, 0x1b, 0x9a, 0x0f, 0xb2, 0x79, 0x82, 0xbf, 0xc3, 0xa7, 0x99, 0x0b, + 0xfc, 0x81, 0x81, 0x2b, 0x51, 0x61, 0xdf, 0x4e, 0xc2, 0xcc, 0x64, 0x09, 0xed, 0x99, 0x06, 0x3a, + 0x85, 0xa8, 0xc6, 0x13, 0x9a, 0xd3, 0x80, 0xdf, 0x21, 0xc1, 0x2b, 0x36, 0xe3, 0x89, 0xf1, 0x64, + 0x36, 0x03, 0xfd, 0x1b, 0x3e, 0xf8, 0x01, 0x24, 0xd7, 0xe1, 0xd2, 0x29, 0xd9, 0x6b, 0xc8, 0xa2, + 0x30, 0x1b, 0xcd, 0xf9, 0x99, 0x06, 0xf9, 0x39, 0x7c, 0x17, 0x0f, 0xf9, 0xdd, 0x5c, 0x27, 0x14, + 0x12, 0xd6, 0xe1, 0x76, 0x69, 0xa6, 0x01, 0x7e, 0x0e, 0xdf, 0xa8, 0x61, 0x3d, 0x9a, 0xbf, 0x67, + 0xbf, 0xc5, 0xe8, 0xe4, 0x4c, 0x03, 0xfc, 0x1c, 0xbe, 0x7f, 0xdb, 0x2e, 0x40, 0x0c, 0xe9, 0xfd, + 0x4c, 0x03, 0xfc, 0x1c, 0xbe, 0x5f, 0x20, 0x6f, 0x96, 0xc5, 0x2a, 0x06, 0xfc, 0x25, 0xd3, 0xa0, + 0x50, 0x01, 0x0a, 0xf1, 0xc6, 0x7a, 0xde, 0xe3, 0x52, 0x6a, 0xc8, 0x34, 0xf7, 0x13, 0x36, 0x3c, + 0x86, 0xe6, 0xa9, 0x4c, 0x83, 0xfc, 0x1b, 0x3e, 0x80, 0xf5, 0xbc, 0xc8, 0xe7, 0x31, 0xc0, 0x2c, + 0xfc, 0xfd, 0x2a, 0x1e, 0x24, 0x2f, 0x53, 0xcd, 0x0d, 0xbc, 0x40, 0x2c, 0xd3, 0x40, 0x7f, 0x87, + 0x0f, 0x60, 0x3d, 0xaf, 0xf1, 0x05, 0xd6, 0x61, 0x18, 0x0b, 0x9c, 0x8d, 0x5c, 0x3a, 0xd8, 0xd2, + 0x06, 0xdc, 0x0b, 0xdc, 0xce, 0x9d, 0xf4, 0x65, 0xf3, 0x84, 0x60, 0xfd, 0x43, 0xdd, 0xcb, 0xb9, + 0x24, 0xb8, 0x1d, 0x98, 0x87, 0xfd, 0x1d, 0x2c, 0xd9, 0xda, 0x0d, 0x3c, 0x0f, 0xfc, 0x0a, 0x7c, + 0xba, 0xe5, 0xaa, 0x8c, 0x43, 0x2c, 0xe6, 0xc3, 0x5c, 0x9f, 0x16, 0xac, 0xf0, 0x1d, 0xe1, 0xee, + 0x6e, 0x99, 0x05, 0x5c, 0x89, 0xbb, 0xde, 0x74, 0x0e, 0x10, 0xb6, 0x5a, 0xd3, 0x80, 0x28, 0xee, + 0x95, 0xfa, 0xab, 0x38, 0xac, 0xe6, 0x6e, 0x36, 0x53, 0xa2, 0x17, 0x4e, 0xc1, 0x0c, 0xdf, 0x60, + 0x2b, 0x88, 0xd0, 0xcd, 0x05, 0x24, 0x98, 0x8a, 0x1b, 0xc4, 0x46, 0x60, 0x12, 0x70, 0x9a, 0x87, + 0x67, 0x8d, 0x03, 0x3b, 0x71, 0x37, 0x92, 0xbe, 0x83, 0x62, 0x1b, 0x8a, 0x16, 0xea, 0xd9, 0x26, + 0xbb, 0x9d, 0x5d, 0xa5, 0x11, 0xbe, 0xe3, 0x71, 0x43, 0x39, 0x91, 0x04, 0x63, 0x80, 0x53, 0x50, + 0x8c, 0xb9, 0xfe, 0xdc, 0xeb, 0x17, 0x86, 0x9d, 0xf0, 0xf4, 0x95, 0x5b, 0x56, 0x66, 0xbc, 0x80, + 0x71, 0x94, 0xc3, 0xa2, 0x69, 0x8b, 0x68, 0xfd, 0xa8, 0x75, 0xed, 0xda, 0xff, 0xad, 0x5d, 0x07, + 0xec, 0x41, 0xd1, 0x89, 0x62, 0x0f, 0x71, 0xda, 0xd0, 0xd9, 0xcd, 0x7d, 0x4a, 0x55, 0x69, 0x87, + 0x2f, 0x0d, 0x63, 0xcc, 0xf2, 0x8e, 0xee, 0x8e, 0x45, 0x0d, 0xcb, 0x1b, 0xca, 0x32, 0x8d, 0x2d, + 0x0f, 0x95, 0xd3, 0xbb, 0xa4, 0x17, 0xe0, 0x56, 0xa5, 0xd4, 0xc3, 0xde, 0x57, 0x17, 0x2c, 0xb2, + 0x3c, 0x21, 0xac, 0x91, 0xf0, 0x09, 0x6b, 0x24, 0x7c, 0x69, 0xa8, 0x2c, 0x67, 0x23, 0xc6, 0x94, + 0xe4, 0x45, 0xea, 0xb0, 0x91, 0xf0, 0xa5, 0xca, 0x27, 0x51, 0x32, 0x77, 0xce, 0x83, 0x84, 0x4f, + 0x58, 0x23, 0xe1, 0x13, 0xd6, 0x48, 0xf8, 0xd2, 0x50, 0x2a, 0xcb, 0x39, 0x5f, 0x69, 0x7e, 0x30, + 0x31, 0x6c, 0x24, 0x7c, 0xa9, 0x64, 0xce, 0x57, 0x20, 0x12, 0x3e, 0x61, 0x8d, 0x84, 0x4f, 0x58, + 0x23, 0xe1, 0x4b, 0x43, 0xd6, 0xf9, 0x0a, 0x43, 0xc2, 0x97, 0x4a, 0xe6, 0x7c, 0x05, 0x22, 0xe1, + 0x13, 0xd6, 0x48, 0xf8, 0x84, 0x35, 0x12, 0xbe, 0x34, 0x64, 0x9d, 0xaf, 0x30, 0x24, 0x7c, 0xa9, + 0x64, 0xce, 0x57, 0x20, 0x12, 0x3e, 0x61, 0x8d, 0x84, 0x4f, 0x58, 0x23, 0xe1, 0x4b, 0x65, 0x22, + 0xe1, 0x88, 0x33, 0x73, 0xfc, 0x4c, 0xaa, 0x2b, 0xaa, 0x8f, 0x3b, 0xa8, 0xbe, 0xaa, 0x9e, 0x79, + 0xcd, 0xf3, 0x8e, 0xfc, 0x51, 0xde, 0x76, 0xf3, 0x20, 0x3f, 0xb4, 0x41, 0x8c, 0x31, 0xd7, 0x26, + 0x4c, 0x62, 0xa5, 0xa3, 0x9c, 0x4a, 0x80, 0xee, 0xbe, 0xee, 0x78, 0x34, 0x16, 0x4d, 0xf4, 0xc4, + 0x7a, 0x30, 0xc6, 0x50, 0xee, 0x94, 0x53, 0x55, 0x5e, 0xe5, 0x54, 0x57, 0x54, 0x87, 0x00, 0xe2, + 0x26, 0xfe, 0x51, 0x48, 0x85, 0xae, 0x56, 0x4a, 0xbd, 0x6a, 0xb7, 0x72, 0xff, 0x91, 0xf0, 0xa5, + 0x61, 0x8c, 0x29, 0xc7, 0xed, 0x01, 0xd3, 0x04, 0x9c, 0x0a, 0x44, 0x18, 0x68, 0xf9, 0x75, 0x00, + 0xe8, 0x05, 0x5a, 0x81, 0xd7, 0x95, 0x52, 0x6f, 0x59, 0x29, 0x52, 0x08, 0x91, 0x3f, 0x79, 0xe5, + 0x1b, 0xc4, 0x18, 0x33, 0x1d, 0xb8, 0x31, 0xc7, 0xa7, 0x3d, 0xa5, 0x94, 0x7a, 0xcd, 0x8b, 0x7a, + 0x82, 0xac, 0x58, 0x5a, 0x48, 0x14, 0x93, 0xf9, 0xb1, 0x44, 0xec, 0x9b, 0xdb, 0xf7, 0x6e, 0x1f, + 0xb2, 0xab, 0x40, 0x82, 0x84, 0x63, 0x8c, 0x71, 0xce, 0x1f, 0x7b, 0x7e, 0x08, 0xd8, 0x02, 0x48, + 0xf8, 0x72, 0x24, 0xe1, 0x4b, 0xe3, 0xc3, 0x43, 0x1f, 0xc6, 0xa7, 0x3c, 0x3a, 0xa5, 0x22, 0xd3, + 0xb8, 0x8a, 0x50, 0x05, 0xd1, 0x25, 0xd1, 0x42, 0x94, 0x14, 0x48, 0xb2, 0xd4, 0x22, 0xac, 0x91, + 0xf0, 0x09, 0x6b, 0x24, 0x7c, 0x69, 0x38, 0x2a, 0xbb, 0x1f, 0xcb, 0x31, 0x1b, 0x0b, 0xe4, 0xc2, + 0x2d, 0x0f, 0x12, 0xbe, 0x54, 0xb2, 0x55, 0xa5, 0x40, 0x24, 0x7c, 0xc2, 0x1a, 0x09, 0x9f, 0xb0, + 0x46, 0xc2, 0x97, 0x46, 0x1e, 0x37, 0x10, 0xc9, 0x9c, 0x2f, 0x0f, 0x12, 0xbe, 0x54, 0x32, 0xe7, + 0x2b, 0x10, 0x09, 0x9f, 0xb0, 0x46, 0xc2, 0x27, 0xac, 0x91, 0xf0, 0xa5, 0x21, 0x37, 0x10, 0x15, + 0x86, 0x84, 0x2f, 0x95, 0xdc, 0x40, 0x54, 0x20, 0x12, 0x3e, 0x61, 0x8d, 0x84, 0x4f, 0x58, 0x23, + 0xe1, 0x4b, 0x43, 0x1a, 0x05, 0x15, 0x86, 0x84, 0x2f, 0x95, 0xcc, 0xf9, 0x0a, 0x44, 0xc2, 0x27, + 0xac, 0x91, 0xf0, 0x09, 0x6b, 0x24, 0x7c, 0x69, 0xc8, 0x3a, 0x5f, 0x61, 0x48, 0xf8, 0x52, 0xc9, + 0x9c, 0xaf, 0x40, 0x24, 0x7c, 0xc2, 0x1a, 0x09, 0x9f, 0xb0, 0x46, 0x6e, 0x9d, 0x4c, 0x65, 0x2a, + 0xc3, 0x95, 0xa1, 0xf9, 0x93, 0xe7, 0xb3, 0x65, 0xf7, 0x16, 0x3a, 0xba, 0x3b, 0xe8, 0xea, 0xed, + 0xfa, 0xc4, 0x80, 0x48, 0x38, 0x42, 0x73, 0x5d, 0x33, 0x33, 0xc6, 0xcf, 0x38, 0xf2, 0x25, 0x79, + 0xdb, 0x15, 0x27, 0xce, 0x18, 0xf3, 0xc5, 0xfe, 0x78, 0x7f, 0xbb, 0x19, 0xe4, 0x70, 0xff, 0xe1, + 0xd8, 0xc1, 0xde, 0x83, 0xb1, 0x63, 0xbf, 0x96, 0x48, 0x24, 0x12, 0x7d, 0xf1, 0xbe, 0x37, 0x8c, + 0x31, 0xd3, 0x6c, 0xd7, 0xed, 0x47, 0xf2, 0x3f, 0xf6, 0x38, 0x8c, 0x31, 0x93, 0x80, 0x4f, 0xe1, + 0x36, 0x0a, 0x1a, 0x89, 0xdb, 0x2c, 0x48, 0x01, 0x51, 0xa0, 0x0b, 0xd8, 0x09, 0x6c, 0x54, 0x4a, + 0x75, 0x1d, 0xf7, 0x20, 0x42, 0x88, 0xe2, 0x24, 0xaf, 0x7c, 0x83, 0x18, 0x63, 0xca, 0x80, 0xd3, + 0x73, 0x78, 0xca, 0x49, 0x40, 0xbb, 0x52, 0x6a, 0xaf, 0x47, 0x25, 0x89, 0x52, 0x61, 0x8c, 0xd1, + 0x83, 0xe7, 0x7b, 0x59, 0xb8, 0xd9, 0x76, 0xdd, 0x7e, 0x24, 0x57, 0xbb, 0xa9, 0xaa, 0xf7, 0x1d, + 0xde, 0x17, 0x5b, 0xf0, 0xfb, 0x05, 0x19, 0x7f, 0x36, 0x65, 0x4e, 0x19, 0xcf, 0x2d, 0x7c, 0xae, + 0x10, 0x35, 0x05, 0x92, 0x84, 0x2f, 0x8d, 0x68, 0x2c, 0x6a, 0x5e, 0x6e, 0x7d, 0x39, 0xe3, 0xb8, + 0x8a, 0x50, 0xc6, 0x46, 0x56, 0x62, 0x08, 0xb2, 0xc8, 0x2c, 0xac, 0x91, 0xf0, 0xa5, 0x91, 0x47, + 0xa3, 0x20, 0x91, 0x07, 0x09, 0x5f, 0x2a, 0xd9, 0x58, 0x50, 0x20, 0x12, 0x3e, 0x61, 0x8d, 0x84, + 0x4f, 0x58, 0x23, 0xe1, 0x4b, 0x43, 0x6e, 0x20, 0x2a, 0x0c, 0x09, 0x5f, 0x2a, 0x99, 0xf3, 0x15, + 0x88, 0x84, 0x4f, 0x58, 0x23, 0xe1, 0x13, 0xd6, 0x48, 0xf8, 0x84, 0x35, 0x12, 0xbe, 0x34, 0xf2, + 0xb8, 0x7b, 0x4d, 0xe6, 0x7c, 0x79, 0x28, 0xdd, 0xcf, 0x76, 0x35, 0x95, 0x38, 0x34, 0x62, 0x38, + 0x03, 0xa8, 0xc3, 0x50, 0x0b, 0xd4, 0x3f, 0xfd, 0x9f, 0xa7, 0xaf, 0x98, 0x35, 0x61, 0x56, 0x28, + 0x97, 0x43, 0x3d, 0xb8, 0xf1, 0xc1, 0xaf, 0xa0, 0x69, 0x00, 0x3a, 0x8f, 0x79, 0xb4, 0x32, 0x9a, + 0x36, 0x6e, 0xa3, 0x77, 0xd8, 0x6b, 0x0f, 0x88, 0xe0, 0x87, 0x4f, 0x13, 0x06, 0xce, 0x01, 0xa6, + 0x01, 0x53, 0x81, 0xb3, 0x81, 0x49, 0x40, 0x03, 0x89, 0xd4, 0xe1, 0xed, 0x5d, 0xed, 0x24, 0x4c, + 0x9a, 0x6f, 0x0c, 0xe1, 0xbd, 0x03, 0xef, 0x5d, 0x8c, 0xfb, 0x2b, 0x52, 0x3f, 0x69, 0x3f, 0x09, + 0x34, 0xed, 0xc0, 0x0e, 0xe0, 0x6d, 0x14, 0x2d, 0x38, 0xb4, 0x10, 0xe7, 0x6d, 0x74, 0xba, 0xb3, + 0x97, 0x96, 0x60, 0x86, 0x6f, 0x29, 0x67, 0x11, 0xe7, 0x2a, 0x60, 0x0e, 0x70, 0x21, 0x50, 0x69, + 0xa9, 0x12, 0x07, 0x98, 0x90, 0x7c, 0x5c, 0x86, 0xe1, 0x16, 0xe2, 0x00, 0x1c, 0x40, 0xf3, 0x77, + 0x60, 0x0d, 0xb0, 0x06, 0xcd, 0x2e, 0x4b, 0xf5, 0x59, 0x15, 0x9c, 0xf0, 0x69, 0xaa, 0x51, 0xdc, + 0x8c, 0xe1, 0x6b, 0xc4, 0xf9, 0xf4, 0x89, 0x1c, 0x2a, 0xeb, 0x39, 0x5f, 0x72, 0x91, 0x39, 0xdb, + 0x45, 0xe9, 0x63, 0xd4, 0x00, 0x57, 0x24, 0x1f, 0x0f, 0xa1, 0xd9, 0x0c, 0x3c, 0xce, 0x68, 0x56, + 0x95, 0xd2, 0xdb, 0xf4, 0x40, 0xf8, 0x9e, 0x21, 0xc4, 0x76, 0xae, 0xc5, 0x70, 0x35, 0xee, 0x6f, + 0xd8, 0xb6, 0xf5, 0x6a, 0x91, 0x2b, 0x07, 0x45, 0x0d, 0x86, 0x1a, 0xcc, 0x89, 0x5f, 0x40, 0x59, + 0xd8, 0xa9, 0xa2, 0x70, 0xa7, 0x03, 0x53, 0xd9, 0xcf, 0x0f, 0xb9, 0x87, 0x15, 0x9c, 0xcc, 0x43, + 0xa5, 0x10, 0x42, 0x37, 0x7c, 0xf7, 0x51, 0xcf, 0x9b, 0xac, 0x06, 0x2e, 0xb2, 0x5b, 0x4e, 0x9e, + 0x82, 0xf3, 0x29, 0x57, 0x03, 0x86, 0x07, 0xd9, 0xcf, 0xf5, 0x68, 0xae, 0x41, 0xb3, 0xc3, 0x76, + 0x41, 0x5e, 0x72, 0xd0, 0x8c, 0xa0, 0x9f, 0xe7, 0xf1, 0x6b, 0xf0, 0x82, 0xe9, 0x3c, 0x60, 0x3d, + 0xcb, 0x98, 0x60, 0xbb, 0x10, 0x2f, 0x39, 0x28, 0x6e, 0x02, 0x3e, 0x63, 0xbb, 0x90, 0x62, 0x92, + 0xf5, 0xc6, 0x02, 0x6f, 0x5f, 0x72, 0xc7, 0x11, 0xe3, 0x21, 0x2f, 0x4f, 0x60, 0x9b, 0x83, 0x61, + 0xa1, 0xed, 0x22, 0x8a, 0x49, 0x3e, 0x3b, 0x55, 0xb2, 0xbd, 0x40, 0xc9, 0xc3, 0x5c, 0x34, 0x13, + 0xbd, 0x3a, 0xb8, 0x6d, 0x0e, 0x30, 0xd9, 0x76, 0x11, 0x62, 0x48, 0x17, 0xd8, 0x2e, 0xc0, 0x2b, + 0x0e, 0x24, 0x57, 0x9e, 0x04, 0xe0, 0xbe, 0x95, 0x66, 0x7b, 0x0f, 0xc7, 0x91, 0x71, 0x79, 0x2c, + 0xb5, 0xe4, 0xa2, 0xdb, 0xcb, 0x83, 0xdb, 0x14, 0x06, 0xb6, 0x00, 0xb3, 0x6c, 0x17, 0x52, 0x2c, + 0x7a, 0xfa, 0x7b, 0x18, 0x3b, 0x72, 0x2c, 0x3b, 0xef, 0xd8, 0xc9, 0x96, 0x0e, 0xb7, 0x4b, 0xd5, + 0xc7, 0xd1, 0x8f, 0x89, 0xc6, 0xa2, 0xc4, 0x12, 0x31, 0xaa, 0xca, 0xab, 0x18, 0x55, 0x3e, 0x8a, + 0xa6, 0xba, 0x26, 0xa6, 0x8f, 0x9b, 0x0e, 0xc0, 0xa1, 0xfe, 0x43, 0x5e, 0x95, 0x13, 0x03, 0x36, + 0x7b, 0x75, 0x70, 0xdb, 0x14, 0x9a, 0x6f, 0x00, 0x2b, 0x6d, 0x17, 0x52, 0x2c, 0x22, 0xe1, 0x08, + 0x73, 0xcf, 0x9e, 0xcb, 0xec, 0x89, 0xb3, 0x69, 0xae, 0x6b, 0x66, 0x5c, 0xf5, 0x38, 0x22, 0xe1, + 0x08, 0x91, 0xb2, 0x08, 0x0a, 0x45, 0x34, 0x16, 0xa5, 0xa7, 0xbf, 0x87, 0xb6, 0x8f, 0xdb, 0xd8, + 0xb0, 0x73, 0x03, 0x1b, 0xdb, 0x37, 0xf2, 0x4a, 0xdb, 0x2b, 0xc4, 0x12, 0x31, 0x2f, 0xca, 0xf9, + 0x19, 0x9a, 0xef, 0x78, 0x71, 0xe0, 0x62, 0xa0, 0xd0, 0x38, 0xc0, 0x0b, 0xc0, 0x6c, 0xdb, 0xc5, + 0x88, 0x4f, 0x78, 0x15, 0xf7, 0x82, 0xa3, 0xc7, 0x76, 0x21, 0x5e, 0x71, 0xd0, 0x24, 0xa8, 0x62, + 0x1e, 0xf0, 0xac, 0xed, 0x62, 0xc4, 0x51, 0xbf, 0x24, 0xe0, 0xc1, 0x83, 0xc1, 0xfb, 0xd0, 0xee, + 0xe5, 0x62, 0x12, 0x5c, 0x83, 0xfb, 0xf1, 0x9a, 0x9f, 0x7a, 0x41, 0x9c, 0x04, 0xc9, 0xad, 0x51, + 0xfe, 0x65, 0x80, 0x75, 0xc0, 0x7d, 0xc9, 0x4d, 0x07, 0x81, 0x17, 0xac, 0x4d, 0x90, 0xee, 0x7f, + 0x9e, 0xaf, 0x03, 0x57, 0x02, 0x63, 0x6d, 0x97, 0x93, 0xa5, 0x56, 0x60, 0x35, 0xf0, 0x04, 0x9a, + 0x37, 0x6d, 0x17, 0x53, 0x48, 0xc1, 0x0a, 0xdf, 0x11, 0x1a, 0x07, 0x87, 0xe9, 0x24, 0x98, 0x83, + 0xbb, 0xcf, 0xee, 0x42, 0xa0, 0xda, 0x72, 0x55, 0x47, 0x74, 0x02, 0x2d, 0xc0, 0xeb, 0x38, 0xac, + 0xe5, 0x6e, 0xb6, 0xda, 0x2e, 0xc8, 0x96, 0x60, 0x86, 0x6f, 0x30, 0xf7, 0xa2, 0xaa, 0x19, 0x37, + 0x84, 0x4d, 0x40, 0x23, 0xee, 0x86, 0xd2, 0x46, 0xdc, 0xb7, 0x6c, 0x2f, 0x74, 0xe2, 0x6e, 0x22, + 0x7d, 0x07, 0xd8, 0x81, 0x62, 0x3b, 0x86, 0x4d, 0x68, 0x5a, 0x3d, 0x3a, 0x9f, 0xef, 0x94, 0x46, + 0xf8, 0x86, 0xf2, 0x63, 0x6a, 0x88, 0x52, 0x8f, 0x43, 0x2d, 0x86, 0xba, 0xc5, 0x33, 0x17, 0x7f, + 0x5b, 0x29, 0x75, 0xd9, 0xb2, 0xbf, 0x2d, 0xcb, 0xb8, 0x95, 0x3e, 0xe4, 0x84, 0x78, 0x60, 0xf6, + 0x03, 0xec, 0xd8, 0xbf, 0x63, 0xd5, 0x23, 0x9b, 0x1f, 0x79, 0x06, 0x87, 0x7d, 0x24, 0xd8, 0x0b, + 0xec, 0x41, 0x07, 0x77, 0x71, 0x78, 0xb8, 0x48, 0xf8, 0x06, 0x31, 0xc6, 0x2c, 0xef, 0xe8, 0xee, + 0x58, 0xd4, 0xb0, 0xbc, 0xa1, 0x2c, 0xd3, 0xd8, 0xf2, 0x50, 0x39, 0xbd, 0x4b, 0x7a, 0x01, 0x6e, + 0x55, 0x4a, 0x3d, 0xec, 0x7d, 0x75, 0xc1, 0x22, 0x77, 0xaf, 0x09, 0x6b, 0x24, 0x7c, 0xc2, 0x1a, + 0x09, 0x9f, 0xb0, 0x46, 0xc2, 0x97, 0x46, 0x1e, 0x5d, 0xaa, 0x64, 0xee, 0x9c, 0x07, 0x09, 0x5f, + 0xaa, 0xe0, 0xdc, 0x11, 0x52, 0xe4, 0x24, 0x7c, 0xc2, 0x1a, 0x09, 0x9f, 0xb0, 0x46, 0xc2, 0x97, + 0x86, 0x34, 0x0a, 0x2a, 0x8c, 0xe0, 0x74, 0x2c, 0xc8, 0x85, 0xdb, 0xbf, 0xe5, 0x0c, 0x14, 0x8d, + 0x18, 0x26, 0x00, 0xa7, 0xe0, 0xee, 0x88, 0xa9, 0x5d, 0xb5, 0x75, 0xd5, 0x8c, 0xd9, 0x13, 0x67, + 0xe7, 0xf4, 0x73, 0x59, 0xfa, 0xda, 0xd2, 0x6f, 0xa1, 0x99, 0x8a, 0xfb, 0x91, 0xda, 0x3e, 0x60, + 0x37, 0xf0, 0x2e, 0x61, 0xde, 0x21, 0x46, 0xbb, 0xf4, 0x65, 0x49, 0x2f, 0xf8, 0xe1, 0xbb, 0x9f, + 0x31, 0xf4, 0x31, 0x95, 0x81, 0x46, 0x41, 0x4d, 0xb8, 0xbd, 0x53, 0xc2, 0xe9, 0x2e, 0x2d, 0xf6, + 0x1e, 0xda, 0x9b, 0xf3, 0x1d, 0x6c, 0x7b, 0x7a, 0xf6, 0x4c, 0x26, 0xdd, 0x8d, 0x58, 0xee, 0xe6, + 0xe6, 0x5e, 0x34, 0x6d, 0xc0, 0x76, 0x14, 0x9b, 0x80, 0x96, 0xe4, 0x67, 0xbc, 0x25, 0xff, 0xab, + 0x52, 0x83, 0x17, 0x3e, 0x4d, 0x18, 0xc5, 0x2c, 0x0c, 0x57, 0x02, 0x73, 0xe8, 0x63, 0x92, 0xe5, + 0x8a, 0x2a, 0x70, 0x37, 0x35, 0x34, 0x63, 0xb8, 0x2a, 0xf9, 0xb5, 0x04, 0x9a, 0x37, 0x80, 0x3f, + 0x03, 0xab, 0xd1, 0x6c, 0xa2, 0x04, 0xaf, 0xb2, 0x83, 0x13, 0x3e, 0xcd, 0x78, 0xe0, 0xbb, 0xc0, + 0xc2, 0x64, 0xaf, 0xbd, 0xbc, 0xe5, 0xda, 0x28, 0x28, 0x0f, 0x0e, 0x70, 0x6e, 0xf2, 0x71, 0x27, + 0x9a, 0xf7, 0x81, 0x27, 0x80, 0x9f, 0xa3, 0xe9, 0xcc, 0xf7, 0xa0, 0x7e, 0xe3, 0xff, 0x0b, 0x0e, + 0xcd, 0x69, 0x68, 0x9e, 0xc4, 0xdd, 0xbe, 0x74, 0x1b, 0x9c, 0x58, 0xf0, 0xf2, 0xe9, 0x42, 0x30, + 0x0c, 0xb7, 0x4e, 0x8e, 0x03, 0xee, 0x06, 0xde, 0x45, 0xb3, 0x02, 0xed, 0xd9, 0x36, 0xaf, 0xa2, + 0xe2, 0xef, 0xf0, 0xdd, 0xc3, 0x1c, 0x60, 0x1b, 0x70, 0x03, 0x90, 0x71, 0x17, 0x8a, 0x0f, 0x54, + 0x01, 0x77, 0x00, 0xdb, 0xd0, 0x5c, 0x68, 0xbb, 0x18, 0xaf, 0xf9, 0x37, 0x7c, 0xf7, 0x70, 0x39, + 0x86, 0x3f, 0x02, 0x27, 0xdb, 0x2e, 0xc5, 0x03, 0xa7, 0x03, 0x2f, 0xa1, 0x39, 0xc7, 0x76, 0x21, + 0x5e, 0xf2, 0x67, 0xf8, 0x34, 0x23, 0x30, 0x3c, 0x06, 0x94, 0x7b, 0x71, 0xf8, 0x22, 0x69, 0x14, + 0x74, 0x12, 0xf0, 0x28, 0x01, 0x5e, 0x43, 0xf4, 0x67, 0xf8, 0x14, 0x97, 0x03, 0x67, 0x7a, 0x71, + 0xe8, 0x82, 0x34, 0x0a, 0xca, 0xfe, 0x14, 0x33, 0xd0, 0xc1, 0xed, 0xa5, 0xe3, 0xcf, 0xf0, 0xc1, + 0x14, 0xdb, 0x05, 0x9c, 0x90, 0x5c, 0xb2, 0xaa, 0x38, 0xcf, 0xb3, 0x3a, 0x2c, 0xf3, 0x6b, 0xf8, + 0xf6, 0xdb, 0x2e, 0xa0, 0x80, 0x02, 0xbb, 0xf4, 0xe2, 0xcf, 0x75, 0x3e, 0xc3, 0x06, 0xdc, 0x37, + 0xaf, 0x61, 0x9f, 0x0f, 0xc5, 0x12, 0x31, 0xea, 0x47, 0xd6, 0xb3, 0xe6, 0xba, 0x35, 0x6c, 0xdd, + 0xbd, 0x95, 0x5d, 0x5d, 0xbb, 0x38, 0xd4, 0x7f, 0xe8, 0x68, 0xa3, 0xa0, 0x8a, 0x50, 0x05, 0x35, + 0x23, 0x6a, 0x68, 0xaa, 0x6d, 0xe2, 0x92, 0xd3, 0x2f, 0x01, 0x20, 0x9e, 0xf0, 0xac, 0xd1, 0x57, + 0x2f, 0x65, 0x41, 0x6e, 0x14, 0xe4, 0x57, 0x9a, 0xdf, 0x02, 0x0b, 0x86, 0xfb, 0xb0, 0x0d, 0xa3, + 0x1a, 0xb8, 0x65, 0xea, 0x2d, 0x47, 0x1b, 0x05, 0xd5, 0x54, 0xd4, 0xa4, 0x1d, 0xd7, 0xd9, 0xd3, + 0xc9, 0xc6, 0xf6, 0x8d, 0x6c, 0x68, 0xdf, 0xc0, 0xe3, 0xff, 0x7a, 0x9c, 0xfd, 0x87, 0x3d, 0x79, + 0x31, 0xfe, 0x11, 0x9a, 0xbb, 0xbc, 0x38, 0x70, 0x31, 0xf0, 0x6f, 0xf8, 0xdc, 0x5b, 0x1e, 0x5f, + 0xc4, 0xfd, 0xcc, 0x76, 0xf8, 0x0c, 0x7a, 0x3d, 0xad, 0x2c, 0xab, 0x24, 0x12, 0x8e, 0x50, 0x33, + 0xc2, 0x0d, 0x61, 0x77, 0x5f, 0x37, 0xd1, 0x58, 0x94, 0xae, 0x5e, 0xcf, 0x3f, 0x9a, 0x5d, 0x0d, + 0xcc, 0x47, 0xd3, 0xe7, 0xf5, 0x89, 0x6c, 0xf1, 0x6f, 0xf8, 0x00, 0x34, 0x23, 0x81, 0x9f, 0x02, + 0x37, 0xe2, 0xf7, 0xbf, 0xcb, 0x80, 0x18, 0xf0, 0x00, 0xa7, 0xa2, 0xb9, 0x89, 0x7e, 0xdb, 0xc5, + 0x78, 0x29, 0x18, 0xff, 0x60, 0x9a, 0x29, 0xc0, 0xf7, 0x80, 0xeb, 0xf0, 0xeb, 0x3c, 0x16, 0xfa, + 0x80, 0xa7, 0x81, 0x65, 0x68, 0xfe, 0x6b, 0xbb, 0x98, 0x42, 0x08, 0x46, 0xf8, 0x8e, 0x70, 0x7f, + 0xed, 0xd5, 0x57, 0x81, 0x79, 0xf8, 0x63, 0x39, 0x26, 0x01, 0xfc, 0x03, 0x58, 0x4d, 0x19, 0xbf, + 0x61, 0x31, 0x1d, 0xb6, 0x0b, 0x2a, 0xa4, 0x60, 0x85, 0xef, 0x58, 0x9a, 0x89, 0x28, 0xe6, 0x60, + 0xb8, 0x08, 0x77, 0x5e, 0x68, 0x7b, 0x6b, 0x15, 0xb8, 0x61, 0xdb, 0x8e, 0xdb, 0x28, 0x68, 0x23, + 0x65, 0xac, 0x2b, 0xb5, 0xc0, 0x1d, 0x2b, 0xb8, 0xe1, 0x1b, 0xec, 0x7e, 0x6a, 0xe9, 0xe3, 0xb3, + 0x28, 0x9a, 0x30, 0x4c, 0x82, 0xa3, 0x8f, 0x09, 0x0c, 0x7f, 0x2f, 0xc2, 0x1e, 0xdc, 0xd6, 0x67, + 0x3b, 0x18, 0x68, 0x16, 0xf4, 0x16, 0x11, 0xfe, 0xc9, 0xf7, 0x39, 0x38, 0xcc, 0xe7, 0xf2, 0xad, + 0xd2, 0x09, 0xdf, 0x50, 0x7e, 0xc2, 0x28, 0x0e, 0x33, 0x06, 0x87, 0x31, 0x18, 0xea, 0x80, 0xd1, + 0x18, 0x22, 0x00, 0xa8, 0xe4, 0xc6, 0x05, 0x43, 0x04, 0x45, 0x1c, 0xe8, 0xc3, 0x10, 0x87, 0xa3, + 0x3b, 0x91, 0xbb, 0x81, 0xfd, 0x38, 0xec, 0x4d, 0x36, 0x09, 0xea, 0x0c, 0x7a, 0x47, 0x51, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x21, 0xb2, 0xf5, 0x7f, 0xca, 0xef, 0x2f, 0x6b, 0x77, 0x6b, 0xc4, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pads_remove_unused_keep_bottom_xpm[1] = {{ png, sizeof( png ), "pads_remove_unused_keep_bottom_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_other/pads_reset_unused.cpp b/bitmaps_png/cpp_other/pads_reset_unused.cpp new file mode 100644 index 0000000000..da65858968 --- /dev/null +++ b/bitmaps_png/cpp_other/pads_reset_unused.cpp @@ -0,0 +1,263 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x90, 0x08, 0x06, 0x00, 0x00, 0x00, 0x16, 0x4d, 0xb9, + 0x35, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x55, 0x2d, 0x00, 0x00, 0x55, + 0x2d, 0x01, 0x6a, 0xe7, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x00, 0x52, 0x74, + 0x45, 0x58, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x43, 0x43, 0x20, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x41, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x62, 0x79, 0x2d, 0x73, 0x61, + 0x2f, 0x34, 0x2e, 0x30, 0x2f, 0xc3, 0x54, 0x62, 0x05, 0x00, 0x00, 0x0e, 0xc3, 0x49, 0x44, 0x41, + 0x54, 0x78, 0x9c, 0xed, 0xdd, 0x7b, 0x94, 0x1e, 0x75, 0x7d, 0xc7, 0xf1, 0xd7, 0x3c, 0xbb, 0x9b, + 0xb0, 0xb9, 0x2d, 0x90, 0x0d, 0xb9, 0x80, 0x44, 0x48, 0x60, 0x93, 0x72, 0x6b, 0xd1, 0x70, 0x91, + 0xc4, 0xd2, 0x12, 0xeb, 0x69, 0xa1, 0x82, 0x0a, 0x05, 0x54, 0x6c, 0xb5, 0xe7, 0xa8, 0x05, 0xc1, + 0x5a, 0x3d, 0x07, 0x35, 0x5e, 0x26, 0x10, 0x15, 0x11, 0xa9, 0xa5, 0x88, 0x55, 0x41, 0x8a, 0xf4, + 0xb4, 0x80, 0xd5, 0x72, 0x82, 0xd4, 0x0b, 0x4d, 0x09, 0x7a, 0x08, 0x75, 0x83, 0x92, 0xe4, 0xa8, + 0x88, 0xe6, 0x02, 0x49, 0x30, 0x17, 0x96, 0x40, 0x62, 0x12, 0x76, 0x93, 0xdd, 0x67, 0xfa, 0xc7, + 0x3c, 0xbb, 0x09, 0xc9, 0xc2, 0x5e, 0xf2, 0xcc, 0xce, 0x33, 0xf3, 0xcc, 0xfb, 0x9c, 0x39, 0x39, + 0xe7, 0xc9, 0x3c, 0xbf, 0xdf, 0x67, 0x93, 0xcf, 0xce, 0xfc, 0x2e, 0xdf, 0xf9, 0x0c, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x79, 0x27, 0x48, 0x5b, 0x40, 0xcd, 0x10, 0x3a, 0x0c, + 0xad, 0x4a, 0x26, 0x8a, 0xb4, 0x8a, 0x8c, 0x16, 0x18, 0x0b, 0x22, 0x63, 0x31, 0xaa, 0x72, 0x66, + 0xa7, 0xc0, 0x4b, 0x95, 0xcf, 0x7f, 0x2f, 0xd0, 0x25, 0xd0, 0xa1, 0x41, 0x87, 0x56, 0x1d, 0xde, + 0x6f, 0x6f, 0x2a, 0xfa, 0x33, 0x48, 0x7d, 0x99, 0xef, 0x7a, 0x27, 0xe8, 0x71, 0x92, 0xc0, 0x0c, + 0x91, 0x99, 0x98, 0x81, 0xe3, 0x30, 0x05, 0xe3, 0xaa, 0xd4, 0xcb, 0x76, 0x6c, 0xc2, 0x3a, 0xac, + 0xde, 0xef, 0x58, 0x25, 0xb4, 0xb1, 0x4a, 0x7d, 0xe4, 0x82, 0xfc, 0x9a, 0x2f, 0xd4, 0x28, 0x30, + 0x4f, 0xe4, 0x8f, 0x71, 0x46, 0xe5, 0x98, 0x98, 0xb2, 0xaa, 0xdf, 0xa1, 0x5d, 0xa0, 0x5d, 0x64, + 0x89, 0xd0, 0x72, 0x44, 0x29, 0x6b, 0x4a, 0x8d, 0x7c, 0x99, 0xef, 0x3e, 0x0d, 0x7e, 0xe5, 0x2f, + 0xf1, 0x36, 0x9c, 0x8f, 0x23, 0x53, 0x56, 0x34, 0x10, 0xbf, 0xc3, 0x62, 0x7c, 0x5b, 0xe8, 0x7f, + 0xd3, 0x16, 0x33, 0xd2, 0xe4, 0xc3, 0x7c, 0xa1, 0x51, 0xb8, 0x0c, 0x9f, 0x40, 0x5b, 0xca, 0x6a, + 0x86, 0xcb, 0x46, 0x3c, 0x84, 0x76, 0x94, 0x53, 0xd6, 0x32, 0x34, 0x02, 0x2f, 0x88, 0x3c, 0x36, + 0xd4, 0x61, 0x45, 0xf6, 0xcd, 0x17, 0x7a, 0x03, 0xbe, 0x25, 0x1e, 0xbf, 0x15, 0xa4, 0x47, 0x19, + 0xff, 0x85, 0x6b, 0x84, 0x7e, 0x37, 0x98, 0x2f, 0x64, 0xdb, 0x7c, 0xa1, 0x0b, 0xf0, 0x1d, 0xfb, + 0x66, 0xa2, 0x05, 0xe9, 0xb3, 0x5e, 0xa3, 0xb9, 0x3e, 0x69, 0xc3, 0x40, 0x27, 0x96, 0x46, 0x42, + 0x4d, 0x22, 0x84, 0x8e, 0xc1, 0x3d, 0x0a, 0xe3, 0xd5, 0x1a, 0xc7, 0xea, 0xf6, 0xcd, 0xc1, 0x9c, + 0x98, 0x5d, 0xf3, 0xf1, 0x31, 0x2a, 0xeb, 0x70, 0xfd, 0x51, 0xb7, 0x73, 0xc8, 0x9a, 0x60, 0xbe, + 0xd0, 0x1f, 0x0e, 0x74, 0x52, 0x96, 0xcd, 0x77, 0xf6, 0xab, 0xfe, 0xed, 0x50, 0x07, 0x14, 0x85, + 0x59, 0xab, 0xcd, 0xb9, 0x03, 0x9d, 0x90, 0x65, 0xf3, 0x8d, 0xaf, 0x6a, 0x6b, 0xd9, 0x1e, 0xfd, + 0xd6, 0x22, 0x47, 0x0c, 0x74, 0x42, 0x96, 0xcd, 0xf7, 0x44, 0xda, 0x02, 0x0a, 0x5e, 0x95, 0x67, + 0x07, 0x3a, 0x21, 0xcb, 0xe6, 0xfb, 0x8a, 0xe2, 0x66, 0x59, 0xab, 0x74, 0xe3, 0x07, 0x03, 0x9d, + 0xd4, 0x30, 0x02, 0x42, 0x92, 0x61, 0xa9, 0x67, 0x9c, 0xab, 0xc5, 0x40, 0x63, 0xbf, 0x82, 0x34, + 0xf8, 0x9a, 0xd0, 0xbf, 0x0f, 0x74, 0x52, 0x76, 0xcd, 0x07, 0x4b, 0xfd, 0xc8, 0x9f, 0x88, 0x30, + 0x4f, 0xb6, 0xaf, 0xe2, 0x79, 0xe2, 0x7f, 0x4c, 0xf0, 0x1e, 0x3f, 0xd4, 0x3d, 0xd0, 0x89, 0xd9, + 0x36, 0x1f, 0x2c, 0xf5, 0x88, 0x3f, 0xf5, 0xa0, 0xc8, 0x14, 0x9c, 0xa8, 0x98, 0x3a, 0xa4, 0xc5, + 0x3a, 0x5c, 0x87, 0x0f, 0xf9, 0xb8, 0x3d, 0x83, 0xf9, 0x42, 0xbe, 0xfe, 0xa3, 0xae, 0x73, 0x8a, + 0xb2, 0x0f, 0xe1, 0x22, 0xe9, 0x57, 0xb0, 0x0c, 0x96, 0xcd, 0xf8, 0x3e, 0xfe, 0x95, 0x8c, 0x96, + 0x5c, 0x35, 0xd9, 0x65, 0x81, 0x2d, 0x43, 0xfd, 0x5a, 0xbe, 0xcc, 0xd7, 0x4b, 0x5c, 0xdd, 0x32, + 0x0f, 0x17, 0x8a, 0xd7, 0x9b, 0x4e, 0x46, 0x63, 0xaa, 0x9a, 0xf6, 0xd1, 0x29, 0x9e, 0xa9, 0x3f, + 0xac, 0xe4, 0x7e, 0x9f, 0xf6, 0xb8, 0x3a, 0x9d, 0x38, 0xe5, 0xd3, 0x7c, 0x07, 0x72, 0xb3, 0x66, + 0x3b, 0x9d, 0xae, 0x6c, 0x8e, 0xd8, 0x88, 0x33, 0x30, 0x13, 0xc7, 0x24, 0xd8, 0x6b, 0x0f, 0xd6, + 0x8b, 0x0b, 0x49, 0xd7, 0x08, 0xac, 0x12, 0x68, 0x37, 0xd9, 0xaa, 0xa2, 0xda, 0x39, 0xa6, 0x3e, + 0xcc, 0xf7, 0x4a, 0xc4, 0xa6, 0x3c, 0x5e, 0xd9, 0x24, 0x1c, 0x25, 0x30, 0xe9, 0x8a, 0x53, 0xae, + 0x78, 0x67, 0x63, 0xa9, 0xf1, 0xcc, 0x3b, 0x57, 0xdc, 0x39, 0xe0, 0x04, 0xa6, 0x14, 0x94, 0x5c, + 0x7d, 0xc6, 0xd5, 0xd6, 0xbe, 0xb0, 0xf6, 0x81, 0x07, 0x7e, 0xfb, 0xc0, 0x83, 0xd8, 0x2a, 0xd0, + 0x21, 0xb0, 0x55, 0x8f, 0x75, 0xc2, 0xc1, 0x8d, 0x7d, 0xea, 0x95, 0xfa, 0x36, 0x5f, 0x3f, 0x44, + 0x51, 0xf4, 0xa5, 0x4d, 0x3b, 0x37, 0x5d, 0x3d, 0xed, 0x4b, 0xd3, 0x9a, 0x06, 0x3a, 0x77, 0x54, + 0xc3, 0x28, 0x5d, 0x9f, 0xec, 0x82, 0xab, 0x82, 0x20, 0xb8, 0x2d, 0x79, 0x75, 0xf9, 0xa2, 0x58, + 0x9e, 0x28, 0x48, 0x8d, 0xc2, 0x7c, 0x05, 0xa9, 0x51, 0x98, 0xaf, 0x1f, 0x82, 0x41, 0x8e, 0x46, + 0xa2, 0xa8, 0x2e, 0x27, 0xa9, 0x55, 0xa3, 0x30, 0xdf, 0xc1, 0x0c, 0xc7, 0x51, 0xc5, 0xd8, 0x79, + 0x18, 0x14, 0xe6, 0x2b, 0x48, 0x8d, 0xc2, 0x7c, 0x05, 0xa9, 0x51, 0x98, 0xaf, 0x1f, 0x82, 0x60, + 0x90, 0x63, 0xbe, 0xfa, 0xdc, 0x98, 0xa8, 0x1a, 0x85, 0xf9, 0x0e, 0xa6, 0x18, 0xf3, 0x8d, 0x10, + 0xb5, 0xb2, 0xdf, 0x99, 0x2e, 0xa1, 0x31, 0x68, 0xc5, 0x51, 0x4f, 0x6c, 0x7e, 0xe2, 0xb8, 0x29, + 0xe3, 0xa6, 0x0c, 0xe9, 0x97, 0xf2, 0xa1, 0xb5, 0x0f, 0xcd, 0x72, 0x9d, 0xd3, 0x94, 0x74, 0xe8, + 0xf6, 0xbc, 0x50, 0x67, 0x32, 0x42, 0xf3, 0x45, 0xfd, 0x98, 0x2f, 0x36, 0xd8, 0xe9, 0xf6, 0xed, + 0xed, 0xf6, 0xee, 0xef, 0xce, 0xc0, 0x98, 0xde, 0xd3, 0x96, 0xac, 0x5d, 0xe2, 0xb2, 0x93, 0x2f, + 0x1b, 0x52, 0xd3, 0x8b, 0x9f, 0x5a, 0x7c, 0x95, 0xb2, 0xab, 0xfa, 0x72, 0x06, 0x42, 0x2f, 0x62, + 0x4d, 0xdf, 0x11, 0x54, 0xf6, 0x76, 0x27, 0x5b, 0x51, 0xec, 0xeb, 0xee, 0x23, 0xbf, 0xe6, 0xbb, + 0x41, 0x8b, 0x4e, 0x7f, 0x2e, 0xae, 0x6a, 0x39, 0xd3, 0x10, 0x2a, 0x5b, 0x06, 0x3d, 0xe6, 0x7b, + 0xe5, 0x75, 0xbe, 0xc3, 0xf1, 0xba, 0xca, 0x11, 0xdf, 0xc8, 0x23, 0x6c, 0xd2, 0x25, 0xf4, 0x84, + 0x38, 0x12, 0x63, 0x89, 0x09, 0x1e, 0xf2, 0x0f, 0x95, 0xb8, 0xb5, 0x3a, 0x24, 0x5f, 0xe6, 0x8b, + 0xaf, 0x6e, 0xef, 0xc2, 0xdb, 0x75, 0x3a, 0xd7, 0x30, 0x1e, 0x28, 0x1f, 0xce, 0x24, 0x62, 0xb0, + 0x8b, 0xd2, 0x18, 0x8d, 0xb3, 0x2a, 0xc7, 0x35, 0x76, 0xd8, 0x2d, 0xf4, 0x03, 0x7c, 0x1b, 0xff, + 0x29, 0x1c, 0xb8, 0xfa, 0x37, 0x4f, 0xe4, 0xc3, 0x7c, 0x5f, 0x30, 0x5e, 0xa7, 0xf7, 0x8a, 0x5c, + 0x8b, 0xa9, 0x69, 0xcb, 0x19, 0x02, 0x63, 0xc4, 0x89, 0x5a, 0x6f, 0xc3, 0x0d, 0x16, 0xfa, 0x47, + 0xe3, 0x7d, 0xbd, 0x5e, 0xae, 0x86, 0xd9, 0x9f, 0xed, 0x86, 0xfe, 0xc2, 0x4b, 0x7e, 0x2b, 0xf2, + 0x65, 0xd9, 0x32, 0xde, 0x81, 0x4c, 0x17, 0xf9, 0xb2, 0x1d, 0x56, 0xba, 0xce, 0x9c, 0xb4, 0xc5, + 0x8c, 0x04, 0xd9, 0x36, 0xdf, 0x42, 0x97, 0x8b, 0xf3, 0xed, 0x26, 0x57, 0xb3, 0xd9, 0x41, 0xef, + 0xed, 0xbe, 0xda, 0x2d, 0x7a, 0xf8, 0x4b, 0x80, 0x27, 0x28, 0x7b, 0x58, 0xe8, 0x8d, 0xc3, 0x6e, + 0x21, 0x23, 0x64, 0xd7, 0x7c, 0x8b, 0x4c, 0x17, 0xb9, 0x43, 0x95, 0x1f, 0x82, 0x1a, 0x4e, 0xb1, + 0x40, 0xbf, 0x13, 0x94, 0x43, 0x5b, 0xf9, 0x1b, 0x8b, 0x7b, 0x84, 0x26, 0x1c, 0x52, 0x2b, 0x35, + 0x4e, 0x76, 0xcd, 0xd7, 0xed, 0xa3, 0x68, 0x4e, 0x5b, 0x46, 0x82, 0x4c, 0x15, 0xf8, 0xdb, 0xb4, + 0x45, 0x24, 0x49, 0x76, 0xcd, 0xa7, 0x0e, 0xc6, 0x45, 0x91, 0x33, 0xd2, 0x96, 0x90, 0x24, 0x59, + 0x36, 0x5f, 0x22, 0x33, 0xf5, 0x48, 0x64, 0xec, 0xa8, 0xb1, 0xe6, 0x1e, 0x3b, 0xd7, 0x84, 0xd1, + 0xaf, 0x7c, 0xd7, 0x9b, 0x3c, 0x76, 0xb2, 0x8b, 0x66, 0x5d, 0x84, 0x21, 0x2d, 0xb5, 0x0c, 0x95, + 0x01, 0x4b, 0xf9, 0xb3, 0x4c, 0x96, 0x97, 0x5a, 0x7e, 0xa6, 0x77, 0x11, 0xb7, 0x1a, 0x44, 0x08, + 0xf8, 0xf9, 0xa6, 0x9f, 0x6b, 0x08, 0x1a, 0xfc, 0xe4, 0x3d, 0x3f, 0x01, 0xdb, 0xbb, 0xb6, 0xdb, + 0xbd, 0x77, 0xb7, 0x97, 0xf6, 0xbe, 0x24, 0x12, 0x69, 0x2a, 0x35, 0x19, 0x3f, 0x7a, 0xbc, 0x23, + 0x0e, 0x8b, 0x43, 0x98, 0x3a, 0x76, 0x77, 0x58, 0xb5, 0x65, 0x55, 0xd5, 0x64, 0xbc, 0x8c, 0xc0, + 0xf2, 0x64, 0x1a, 0xae, 0x0d, 0xb2, 0xbb, 0x21, 0x7e, 0xbd, 0xd9, 0x7a, 0xac, 0x94, 0xc0, 0xd5, + 0x61, 0x54, 0xc3, 0x28, 0x67, 0x1f, 0x73, 0xb6, 0xb6, 0xd6, 0x36, 0x53, 0xc7, 0x4d, 0xd5, 0xdc, + 0xd4, 0xdc, 0x67, 0xb6, 0xed, 0x5d, 0xdb, 0x75, 0x75, 0x77, 0x59, 0xfb, 0xc2, 0x5a, 0x8f, 0x6d, + 0x7c, 0xcc, 0xaf, 0x3b, 0x7e, 0x5d, 0xed, 0xee, 0x7b, 0x79, 0x01, 0x27, 0x0a, 0x75, 0x24, 0xd5, + 0x41, 0xda, 0x64, 0xd7, 0x7c, 0x10, 0xfa, 0x20, 0x6e, 0x91, 0xf5, 0x9f, 0xe3, 0x60, 0xf6, 0xe2, + 0x62, 0xa1, 0xc5, 0x69, 0x0b, 0x49, 0x92, 0x6c, 0x67, 0xb5, 0x2c, 0xd5, 0xee, 0x5c, 0xeb, 0x30, + 0x5f, 0xbc, 0x75, 0x95, 0x07, 0xb6, 0xe0, 0x12, 0xa1, 0xff, 0x4e, 0x5b, 0x48, 0xd2, 0x64, 0xdb, + 0x7c, 0xb0, 0xd4, 0x4a, 0xf3, 0xfd, 0x9b, 0xb2, 0x06, 0x9c, 0x22, 0xbb, 0x83, 0xf4, 0x6d, 0xf8, + 0x22, 0xde, 0x2d, 0xf4, 0x8b, 0xb4, 0xc5, 0x8c, 0x04, 0xf9, 0xba, 0x5d, 0x85, 0x8e, 0xc2, 0x07, + 0xf0, 0x76, 0x9c, 0x9a, 0xb2, 0x9a, 0xc1, 0x50, 0xc6, 0x4f, 0x71, 0x9f, 0x66, 0x77, 0xb8, 0xd6, + 0xef, 0xd3, 0x16, 0x34, 0x92, 0xe4, 0xcb, 0x7c, 0xfb, 0x13, 0x3a, 0x5e, 0x9c, 0x56, 0xd5, 0xfb, + 0xee, 0xb5, 0x29, 0xe9, 0x0a, 0xea, 0xe3, 0x69, 0xbd, 0x25, 0x55, 0x2c, 0x16, 0xda, 0x9c, 0xae, + 0x9c, 0xf4, 0xc8, 0xaf, 0xf9, 0x0e, 0x64, 0x91, 0xd7, 0xe8, 0x71, 0x06, 0x4e, 0xde, 0xef, 0x8d, + 0x93, 0x33, 0x31, 0x29, 0xa1, 0x1e, 0x9f, 0x15, 0x17, 0x93, 0xae, 0xae, 0xfc, 0xb9, 0x0a, 0xed, + 0x42, 0x5b, 0x13, 0xea, 0x2f, 0x73, 0xd4, 0x8f, 0xf9, 0x5e, 0x89, 0x2f, 0x1a, 0x6b, 0x97, 0xa9, + 0xe2, 0x32, 0xfa, 0xd6, 0x05, 0xf3, 0x16, 0x5c, 0x1d, 0x04, 0xc1, 0x79, 0x8b, 0x7e, 0xbc, 0x68, + 0xc0, 0xf1, 0x70, 0x43, 0xa9, 0xc1, 0x8d, 0xf3, 0x6f, 0xb4, 0xe6, 0x85, 0x35, 0xdf, 0xba, 0x6d, + 0xf9, 0x6d, 0xf7, 0xa2, 0x43, 0xa3, 0x2d, 0xc6, 0xd8, 0x5a, 0x2f, 0x65, 0x51, 0x87, 0x42, 0x61, + 0xbe, 0x03, 0x28, 0x82, 0x82, 0x46, 0x8e, 0x2c, 0x6f, 0xaf, 0x15, 0x64, 0x9c, 0xc2, 0x7c, 0x05, + 0xa9, 0x51, 0x98, 0xaf, 0x1f, 0x86, 0x11, 0x14, 0x54, 0x0c, 0x5f, 0x86, 0x41, 0x61, 0xbe, 0x83, + 0x29, 0x62, 0x08, 0x46, 0x88, 0xc2, 0x7c, 0x05, 0xa9, 0x51, 0x98, 0xaf, 0x20, 0x35, 0x0a, 0xf3, + 0xf5, 0x43, 0x11, 0x14, 0x34, 0x32, 0x14, 0xe6, 0x3b, 0x98, 0x22, 0x28, 0x68, 0x84, 0xc8, 0x72, + 0x25, 0xf3, 0xa1, 0x13, 0x2a, 0x61, 0x9a, 0x92, 0x49, 0x22, 0x47, 0xa1, 0x75, 0xc9, 0xda, 0x25, + 0xa7, 0xcf, 0x9e, 0x34, 0x7b, 0x48, 0xd5, 0x3e, 0x77, 0xaf, 0xba, 0xfb, 0x8d, 0x16, 0x7a, 0x5e, + 0x64, 0x0b, 0x3a, 0x34, 0x79, 0xce, 0x02, 0x9b, 0x12, 0xd1, 0x9c, 0x23, 0xea, 0xc3, 0x7c, 0xa1, + 0x46, 0x71, 0x56, 0xcb, 0x19, 0x98, 0x2d, 0xde, 0xd3, 0x9d, 0x89, 0xe3, 0x30, 0xba, 0x2f, 0xe0, + 0x07, 0x4f, 0x6c, 0x7e, 0x42, 0x5b, 0x6b, 0xdb, 0x90, 0x9a, 0x6f, 0x7f, 0xb6, 0xfd, 0x12, 0x91, + 0x4b, 0xfa, 0x3e, 0xd8, 0x8b, 0xd0, 0x2e, 0x2f, 0x0f, 0x0b, 0xfa, 0x85, 0x92, 0x76, 0x3d, 0x9e, + 0x12, 0xee, 0xdf, 0x63, 0xfd, 0x92, 0x4f, 0xf3, 0x85, 0x4a, 0x4a, 0xce, 0x54, 0xf6, 0x16, 0xcc, + 0x15, 0xa7, 0x53, 0x8d, 0x19, 0xe0, 0x5b, 0x7d, 0x54, 0x21, 0x28, 0x88, 0xf8, 0xd9, 0xdb, 0x53, + 0xf5, 0x96, 0x76, 0x45, 0xe2, 0x77, 0x12, 0xb1, 0x43, 0x68, 0xb9, 0xc0, 0x23, 0x02, 0x8b, 0x7d, + 0xda, 0xca, 0xc1, 0xea, 0xca, 0x1b, 0xf9, 0x32, 0x5f, 0xe8, 0x54, 0x5c, 0x85, 0xb7, 0x28, 0x0f, + 0xaf, 0x84, 0x2a, 0xe1, 0xa0, 0x20, 0x98, 0x80, 0xf3, 0x44, 0xce, 0x13, 0xb9, 0x4e, 0x68, 0x1d, + 0xbe, 0xab, 0xc1, 0x57, 0x7c, 0xca, 0xba, 0x21, 0x77, 0x9e, 0x61, 0xf2, 0x31, 0xe1, 0x08, 0x9d, + 0x25, 0xf4, 0x00, 0x56, 0xe0, 0x7d, 0x6a, 0xa7, 0x76, 0x6f, 0x30, 0x1c, 0x87, 0x8f, 0xe8, 0xf1, + 0x1b, 0xa1, 0x6f, 0x09, 0xfd, 0x41, 0xda, 0x82, 0x46, 0x8a, 0x6c, 0x9b, 0xef, 0x6b, 0x9a, 0x84, + 0x6e, 0xc1, 0x32, 0x5c, 0x20, 0xdb, 0xb3, 0xce, 0x46, 0x5c, 0x81, 0x15, 0x16, 0xba, 0x36, 0x6d, + 0x31, 0x23, 0x41, 0x76, 0xcd, 0x17, 0x2a, 0xd9, 0xe4, 0x1e, 0x5c, 0xad, 0xca, 0xa6, 0xab, 0x4a, + 0x50, 0xd0, 0xf0, 0x69, 0x12, 0xb9, 0x41, 0xe8, 0xa6, 0x24, 0x1a, 0xaf, 0x25, 0xb2, 0x6b, 0xbe, + 0x38, 0xc7, 0xe4, 0x6d, 0xd5, 0x6e, 0xb6, 0x6a, 0x41, 0x41, 0x87, 0xce, 0x47, 0x84, 0xe6, 0x27, + 0xd1, 0x70, 0xad, 0x90, 0x5d, 0xf3, 0x45, 0x3e, 0x36, 0x84, 0x73, 0xb3, 0x4a, 0xae, 0x6f, 0xbf, + 0xd9, 0x34, 0xdf, 0xe7, 0x1d, 0x21, 0x1e, 0xa8, 0x0f, 0x8e, 0x5a, 0x1d, 0x09, 0x0e, 0xfc, 0x4b, + 0x71, 0xba, 0xda, 0x55, 0x7f, 0xc8, 0x64, 0x73, 0xa9, 0xa5, 0xab, 0xb2, 0x62, 0x96, 0x00, 0x91, + 0xc8, 0xf8, 0xd1, 0xe3, 0x5d, 0x7a, 0xd2, 0xa5, 0x56, 0x6c, 0x5e, 0x61, 0xd3, 0xce, 0x4d, 0x76, + 0x74, 0xed, 0x78, 0xd9, 0x39, 0xcd, 0x8d, 0xcd, 0x66, 0xb5, 0xce, 0x72, 0xce, 0xb1, 0xe7, 0xe0, + 0x10, 0x82, 0x82, 0x06, 0xfe, 0x5a, 0x8f, 0x2c, 0x5f, 0xb7, 0x07, 0x20, 0x9b, 0xe6, 0x0b, 0xed, + 0x10, 0x7a, 0x0a, 0xb3, 0xaa, 0xdd, 0xf4, 0xd2, 0xa7, 0x97, 0xba, 0xf4, 0xa4, 0x4b, 0xdd, 0x73, + 0xf1, 0x3d, 0x2f, 0xfb, 0x7c, 0xd7, 0xde, 0x5d, 0xba, 0xcb, 0xdd, 0x5a, 0x46, 0xb7, 0xf4, 0x7d, + 0x56, 0x8e, 0xca, 0x56, 0x6d, 0x59, 0xe5, 0xb1, 0x8d, 0x8f, 0x55, 0x5b, 0x46, 0x2f, 0x45, 0x50, + 0x50, 0x4d, 0x12, 0x7a, 0x17, 0xee, 0xae, 0x6a, 0x9b, 0x95, 0xa4, 0x2a, 0x98, 0x79, 0xe4, 0x4c, + 0xb3, 0x5b, 0x67, 0x9b, 0x3a, 0x7e, 0xaa, 0x71, 0xa3, 0xc6, 0x69, 0x6e, 0x6c, 0x16, 0x04, 0x81, + 0xce, 0xee, 0x4e, 0x3b, 0xba, 0x76, 0x58, 0xbf, 0x7d, 0xbd, 0x65, 0x1b, 0x96, 0x1d, 0x74, 0x55, + 0xac, 0xb2, 0x9a, 0xb9, 0x42, 0xcb, 0x92, 0xea, 0x20, 0x6d, 0xb2, 0x6b, 0x3e, 0x02, 0xa1, 0x6f, + 0x90, 0xd3, 0xf4, 0xce, 0xc0, 0x27, 0x7c, 0xc6, 0xe7, 0xd3, 0x96, 0x91, 0x24, 0xd9, 0xce, 0x6a, + 0x39, 0xd7, 0xf7, 0xc4, 0x91, 0x13, 0xf3, 0x64, 0x75, 0xf2, 0x74, 0x30, 0xbb, 0x04, 0xae, 0xf4, + 0x19, 0xb7, 0xa4, 0x2d, 0x24, 0x69, 0xb2, 0x7c, 0xe5, 0xdb, 0x47, 0x68, 0x16, 0x3e, 0x86, 0x77, + 0xc8, 0x6e, 0x50, 0xd0, 0x2e, 0x7c, 0x03, 0x5f, 0x12, 0xda, 0x98, 0xb6, 0x98, 0x91, 0x20, 0x1f, + 0xe6, 0xeb, 0x65, 0x91, 0xe9, 0xba, 0xbd, 0x0f, 0x6f, 0x15, 0x97, 0x4e, 0xd5, 0x3a, 0x91, 0x38, + 0x61, 0xf5, 0x3b, 0xb8, 0x3d, 0xcf, 0x41, 0x90, 0xfd, 0x91, 0x2f, 0xf3, 0xed, 0x4f, 0xe8, 0x44, + 0x81, 0x0b, 0x45, 0xe6, 0xaa, 0xad, 0xa0, 0xa0, 0x67, 0xd0, 0x2e, 0xf0, 0x88, 0x06, 0x8b, 0x7d, + 0xd2, 0x86, 0xb4, 0x05, 0xa5, 0x45, 0x7e, 0xcd, 0x77, 0x20, 0xa1, 0x63, 0x71, 0x86, 0xc0, 0x6c, + 0x91, 0x19, 0x38, 0x41, 0x1c, 0x16, 0x54, 0xd5, 0x17, 0xc8, 0x54, 0x88, 0xb0, 0xd1, 0xfe, 0x41, + 0x41, 0x81, 0x5f, 0x6a, 0xd4, 0x6e, 0x81, 0x2d, 0x09, 0xf4, 0x97, 0x49, 0xea, 0xc7, 0x7c, 0xaf, + 0x44, 0x68, 0x8c, 0x46, 0x93, 0x94, 0x1d, 0x25, 0xd2, 0xfa, 0xa9, 0x37, 0x7e, 0xea, 0x9a, 0x06, + 0x0d, 0x6f, 0x0a, 0x1f, 0x09, 0x07, 0x15, 0x14, 0x74, 0xf3, 0x9f, 0xdd, 0x6c, 0xcd, 0xb6, 0x35, + 0x77, 0xde, 0xd2, 0x7e, 0xcb, 0x3d, 0xd8, 0x8a, 0x0e, 0x74, 0x14, 0xef, 0xdc, 0x1d, 0x98, 0xc2, + 0x7c, 0x07, 0x50, 0x04, 0x05, 0x8d, 0x1c, 0x79, 0x59, 0x9e, 0x28, 0xc8, 0x20, 0x85, 0xf9, 0x0a, + 0x52, 0xa3, 0x30, 0x5f, 0x3f, 0x0c, 0x23, 0x28, 0xa8, 0x60, 0x18, 0x14, 0xe6, 0x3b, 0x98, 0xe2, + 0xa1, 0xf1, 0x11, 0xa2, 0x30, 0x5f, 0x41, 0x6a, 0x14, 0xe6, 0x2b, 0x48, 0x8d, 0xc2, 0x7c, 0x05, + 0xa9, 0x51, 0x98, 0xaf, 0x1f, 0x86, 0x91, 0x52, 0x55, 0x8c, 0xf9, 0x86, 0x41, 0x36, 0x2b, 0x99, + 0xab, 0x41, 0x68, 0x8c, 0x92, 0x19, 0x22, 0xaf, 0x45, 0xab, 0xc8, 0x44, 0x4c, 0xbe, 0xf7, 0x17, + 0xf7, 0xbe, 0x79, 0xde, 0xf4, 0x79, 0x43, 0x2a, 0x35, 0xbb, 0x69, 0xd9, 0x4d, 0xef, 0x10, 0x9a, + 0xa6, 0x77, 0x77, 0x23, 0x3e, 0xd6, 0x3a, 0xd2, 0x3a, 0xd7, 0xe8, 0xaa, 0xba, 0xf6, 0x9c, 0x90, + 0x7f, 0xf3, 0xbd, 0x3c, 0x24, 0x68, 0x0e, 0x4e, 0x14, 0x87, 0x04, 0x4d, 0xeb, 0x2f, 0xae, 0x67, + 0xc3, 0x8e, 0x0d, 0xca, 0xd1, 0xd0, 0x72, 0x7c, 0x9e, 0xd9, 0xfe, 0xcc, 0xd9, 0x38, 0xfb, 0xa0, + 0xbf, 0xd8, 0xa6, 0x2c, 0xb4, 0x41, 0xbc, 0xbf, 0xfb, 0x94, 0x40, 0x7b, 0x11, 0x16, 0xb4, 0x8f, + 0x7c, 0x9a, 0xef, 0x7a, 0x27, 0xe8, 0xf1, 0x56, 0x9c, 0x8f, 0xd7, 0x1b, 0x42, 0x48, 0x50, 0x95, + 0x29, 0x61, 0x7a, 0xe5, 0x38, 0x4f, 0xe4, 0xca, 0xca, 0xa3, 0x4f, 0xdb, 0x85, 0xfe, 0x0f, 0x8b, + 0xc5, 0xaf, 0xc0, 0xaa, 0x8b, 0xfa, 0xbd, 0x03, 0xc9, 0x8f, 0xf9, 0x42, 0x13, 0x04, 0xfe, 0x4e, + 0xe4, 0xdd, 0x7a, 0x0e, 0x2d, 0xef, 0x64, 0xa8, 0x29, 0x55, 0xc3, 0x78, 0x7a, 0xad, 0x05, 0x6f, + 0xae, 0x1c, 0xb7, 0x0a, 0x3d, 0x8e, 0xdb, 0x1d, 0xe9, 0xae, 0x7a, 0xba, 0x4d, 0xef, 0x33, 0xdf, + 0x7d, 0x1a, 0x3c, 0xe9, 0xaf, 0x44, 0xde, 0x8e, 0x36, 0xe9, 0x5d, 0x2d, 0x86, 0x4a, 0x49, 0xa0, + 0x45, 0xa4, 0x45, 0x74, 0xe8, 0x13, 0xa8, 0x14, 0xa2, 0x6e, 0x03, 0xf1, 0x70, 0x60, 0x8e, 0x6d, + 0x3e, 0x63, 0xa1, 0x9b, 0x1d, 0xe1, 0xd6, 0x7a, 0x30, 0x61, 0x6c, 0xbe, 0xcf, 0x9a, 0xec, 0x57, + 0xee, 0xc7, 0x59, 0xe9, 0xca, 0x19, 0x26, 0xf9, 0xd9, 0xe5, 0x9a, 0x26, 0x72, 0x93, 0x6d, 0xae, + 0x10, 0xba, 0x58, 0x68, 0x75, 0xda, 0x82, 0x92, 0xa4, 0x24, 0x74, 0x98, 0xbd, 0xbe, 0x2f, 0xab, + 0xc6, 0xcb, 0x27, 0xa7, 0x61, 0xa9, 0x45, 0xa6, 0xa7, 0x2d, 0x24, 0x49, 0x4a, 0x02, 0xef, 0xc7, + 0x1f, 0xa5, 0x2d, 0xa4, 0x96, 0x48, 0x39, 0xa5, 0xaa, 0x97, 0xa3, 0x75, 0xbb, 0x35, 0xc9, 0x0e, + 0xd2, 0xa6, 0x24, 0xf2, 0xce, 0xb4, 0x45, 0xd4, 0x12, 0x35, 0x94, 0x52, 0x05, 0x17, 0x54, 0x5e, + 0x5a, 0x9d, 0x4b, 0x4a, 0x38, 0x29, 0x6d, 0x11, 0x05, 0xaf, 0xca, 0xe9, 0x69, 0x0b, 0x48, 0x8a, + 0x12, 0xc9, 0x85, 0xee, 0x64, 0x91, 0x48, 0xa4, 0x14, 0x0c, 0x6e, 0xd2, 0xdc, 0x7b, 0xde, 0xb0, + 0x83, 0x82, 0x06, 0xc7, 0xce, 0x24, 0x1b, 0x4f, 0x93, 0x46, 0x71, 0x8e, 0xf1, 0xbc, 0xb4, 0x85, + 0xd4, 0x0a, 0xbb, 0xf7, 0xee, 0x36, 0x65, 0xdc, 0x14, 0xeb, 0x3f, 0xbc, 0xde, 0x8a, 0x4d, 0x71, + 0x4a, 0xd5, 0x8b, 0x9d, 0x2f, 0xea, 0xec, 0xee, 0xd4, 0x5d, 0xee, 0x36, 0x76, 0xd4, 0x58, 0xe3, + 0x47, 0x8d, 0xd7, 0xd6, 0xda, 0xe6, 0xcc, 0xa3, 0xcf, 0x44, 0x1c, 0x22, 0x94, 0x10, 0xdd, 0x78, + 0x3c, 0xa9, 0xc6, 0xd3, 0x26, 0x10, 0xfa, 0x1b, 0xdc, 0x99, 0xb6, 0x90, 0x5a, 0xa1, 0xb9, 0xb1, + 0xd9, 0x05, 0x27, 0x5e, 0x60, 0xfe, 0xf1, 0xf3, 0xcd, 0x6a, 0x9d, 0xe5, 0xe8, 0x09, 0x47, 0x6b, + 0x6e, 0x6c, 0xd6, 0xdc, 0xd4, 0x2c, 0x10, 0x07, 0x05, 0xed, 0xde, 0xbb, 0xdb, 0xba, 0x17, 0xd7, + 0x79, 0x74, 0xfd, 0xa3, 0x96, 0x6d, 0x58, 0x66, 0xc9, 0xba, 0x25, 0xba, 0xcb, 0xdd, 0x49, 0xc8, + 0xf9, 0x27, 0xa1, 0xbf, 0x4f, 0xa2, 0xe1, 0x5a, 0x20, 0xa8, 0xbc, 0x85, 0xe7, 0x87, 0xe4, 0x3b, + 0x82, 0x35, 0x83, 0x3c, 0x2c, 0x9e, 0x70, 0xec, 0x4e, 0x5b, 0x48, 0x52, 0x94, 0x84, 0xca, 0xc6, + 0xba, 0x08, 0xdf, 0x4e, 0x5b, 0x4c, 0x41, 0x1f, 0x5f, 0x97, 0x73, 0xe3, 0x71, 0x60, 0x1d, 0xda, + 0x75, 0xce, 0x56, 0x76, 0xb1, 0x78, 0x7b, 0x6d, 0x74, 0x2a, 0x8a, 0x86, 0xc7, 0xe1, 0x54, 0x4a, + 0xa3, 0xb2, 0x4b, 0x84, 0x07, 0xf1, 0xd9, 0x4a, 0xd1, 0x41, 0xee, 0xc9, 0x57, 0x11, 0x64, 0xfc, + 0xcb, 0xf3, 0xd7, 0xb8, 0x50, 0xed, 0x64, 0xb3, 0x0c, 0xc4, 0x5a, 0xdc, 0x8f, 0x3b, 0x84, 0x7e, + 0x95, 0xb6, 0x98, 0x91, 0x24, 0x5f, 0xe6, 0xeb, 0x65, 0xdf, 0xbb, 0xd7, 0xce, 0x17, 0xd7, 0xd9, + 0xbd, 0x5e, 0xfc, 0xda, 0xa9, 0x5a, 0xa0, 0x03, 0xed, 0x78, 0x4c, 0xc9, 0x03, 0xf5, 0xfc, 0xee, + 0xb5, 0x7c, 0x9a, 0xef, 0x40, 0xe2, 0x49, 0xd5, 0x2c, 0xb1, 0x09, 0xdb, 0xc4, 0x01, 0x41, 0x33, + 0x2b, 0x7f, 0x1e, 0x9e, 0x50, 0xaf, 0x1d, 0x7a, 0x43, 0x82, 0x58, 0x2d, 0xf0, 0xa4, 0xc8, 0x72, + 0xa1, 0xb5, 0x09, 0xf5, 0x97, 0x39, 0xea, 0xc3, 0x7c, 0xaf, 0xc6, 0x0d, 0x5a, 0x74, 0x9a, 0xac, + 0x64, 0xa2, 0x48, 0xeb, 0x82, 0xb9, 0x0b, 0x3e, 0x18, 0x04, 0xc1, 0x79, 0x8b, 0x7e, 0xbc, 0x68, + 0x50, 0x41, 0x41, 0x37, 0xce, 0xbf, 0xd1, 0xea, 0x6d, 0xab, 0xef, 0xfa, 0xea, 0xe3, 0x5f, 0xbd, + 0x4f, 0xc9, 0xf3, 0xca, 0x9e, 0xc3, 0x56, 0x61, 0x7e, 0x17, 0x87, 0xab, 0x45, 0x61, 0xbe, 0x03, + 0x28, 0x82, 0x82, 0x46, 0x8e, 0xe2, 0xe9, 0xb5, 0x82, 0xd4, 0x28, 0xcc, 0x57, 0x90, 0x1a, 0x85, + 0xf9, 0x0a, 0x52, 0xa3, 0x30, 0x5f, 0x3f, 0x0c, 0x23, 0xa5, 0xaa, 0x18, 0x3b, 0x0f, 0x83, 0xc2, + 0x7c, 0x07, 0x93, 0x9f, 0x27, 0x42, 0x6a, 0x9c, 0xc2, 0x7c, 0x05, 0xa9, 0x51, 0x98, 0xaf, 0x20, + 0x35, 0x0a, 0xf3, 0xf5, 0x43, 0x11, 0x14, 0x34, 0x32, 0xe4, 0x27, 0xb1, 0x60, 0x28, 0xc4, 0xf9, + 0x2d, 0xaf, 0x15, 0x98, 0x21, 0x32, 0x1d, 0x47, 0x89, 0x2b, 0x62, 0x26, 0xde, 0xb5, 0xf2, 0xae, + 0x73, 0xe6, 0x1f, 0x3f, 0x7f, 0x48, 0xff, 0x2e, 0xd7, 0x3f, 0x72, 0xfd, 0x07, 0x84, 0xe6, 0x88, + 0xb7, 0xd4, 0x9e, 0xc7, 0x66, 0x3c, 0xad, 0xd1, 0x1a, 0xdd, 0x36, 0x14, 0xb9, 0x2c, 0xfd, 0x93, + 0x7f, 0xf3, 0x7d, 0xce, 0x24, 0x7b, 0xcc, 0xb1, 0x2f, 0x28, 0xa8, 0x4d, 0x9c, 0x9d, 0xd2, 0xd8, + 0xdf, 0xd4, 0xe2, 0xb9, 0x5d, 0xcf, 0x0d, 0xf9, 0x09, 0xb6, 0xad, 0xbb, 0xb7, 0x9e, 0xa4, 0xbf, + 0x07, 0xb1, 0xe2, 0xe2, 0xe6, 0x2e, 0xa1, 0x75, 0x78, 0x52, 0x60, 0x39, 0xda, 0x2b, 0x7b, 0xbc, + 0x89, 0xbd, 0x2b, 0x35, 0x2b, 0xe4, 0xcf, 0x7c, 0xa1, 0x46, 0x81, 0x79, 0x22, 0x17, 0xe2, 0x7c, + 0x7b, 0xcc, 0x4c, 0x59, 0xd1, 0x68, 0x71, 0x51, 0xc3, 0x2c, 0x91, 0xb7, 0x56, 0x3e, 0x2b, 0x0b, + 0xfd, 0x12, 0xdf, 0xc3, 0xfd, 0x42, 0xcb, 0xd5, 0xe1, 0x2c, 0x3b, 0x3f, 0xe6, 0x8b, 0x5f, 0x6f, + 0xf5, 0x11, 0xbc, 0xb3, 0x92, 0xb5, 0x37, 0x6c, 0x86, 0x1a, 0x14, 0x34, 0x0c, 0x4a, 0x38, 0xa5, + 0x72, 0x7c, 0x5c, 0xe8, 0x59, 0xdc, 0x81, 0x7f, 0xae, 0xa7, 0x97, 0xff, 0x65, 0x7f, 0xc2, 0x11, + 0x3a, 0x46, 0xe8, 0x9b, 0xe2, 0xf2, 0xa5, 0x6b, 0x38, 0x34, 0xe3, 0x0d, 0x27, 0x85, 0xa0, 0x0a, + 0x8f, 0x4e, 0x1e, 0x8d, 0x4f, 0xe3, 0x69, 0xa1, 0x9b, 0x85, 0x89, 0x95, 0x79, 0xd5, 0x14, 0xd9, + 0x36, 0xdf, 0x42, 0xe7, 0x63, 0x15, 0xde, 0x23, 0xbb, 0xef, 0xd9, 0xdd, 0x9f, 0xb1, 0xf8, 0x30, + 0x56, 0x09, 0xbd, 0x3e, 0x6d, 0x31, 0x49, 0x93, 0x5d, 0xf3, 0x2d, 0xf4, 0x26, 0x91, 0xef, 0xe2, + 0x88, 0xb4, 0xa5, 0x24, 0xc0, 0x6b, 0xf0, 0x90, 0xd0, 0xc9, 0x69, 0x0b, 0x49, 0x92, 0x6c, 0x9a, + 0x2f, 0x74, 0x98, 0xc8, 0xd7, 0x30, 0x2a, 0x89, 0xe6, 0x6b, 0x24, 0x28, 0xe8, 0x70, 0xfc, 0x8b, + 0x1c, 0xaf, 0x21, 0x66, 0xd3, 0x7c, 0x81, 0x37, 0xe1, 0xb8, 0x24, 0x9a, 0x1e, 0x91, 0xa0, 0xa0, + 0xc1, 0x77, 0x71, 0x8e, 0x30, 0xbf, 0x59, 0x3a, 0xd9, 0x34, 0x1f, 0xa7, 0xa6, 0x2d, 0xe0, 0x90, + 0x18, 0x8a, 0x57, 0x03, 0xa7, 0x25, 0xa6, 0x23, 0x65, 0xb2, 0x6a, 0xbe, 0x6d, 0x69, 0x0b, 0x18, + 0x41, 0x72, 0xbb, 0xf4, 0x92, 0xcd, 0x75, 0xbe, 0xc8, 0xa3, 0xe2, 0x9b, 0x57, 0xd5, 0xc7, 0x43, + 0xdd, 0xe5, 0x6e, 0x93, 0xc7, 0x4d, 0xb6, 0xf8, 0xf2, 0xc5, 0x56, 0x6e, 0x5e, 0x69, 0xe3, 0x8e, + 0x8d, 0x76, 0xed, 0xdd, 0xd5, 0x17, 0x14, 0x34, 0xba, 0x61, 0xb4, 0x96, 0xc3, 0x5a, 0xb4, 0x4d, + 0x6c, 0xf3, 0x86, 0xd7, 0xbc, 0x01, 0xf4, 0x94, 0x13, 0x0b, 0xfa, 0xea, 0xd2, 0x94, 0xe7, 0xa0, + 0xa0, 0xac, 0x12, 0xfa, 0x0f, 0x5c, 0x56, 0xed, 0x66, 0xa7, 0x8d, 0x9f, 0xe6, 0xca, 0x39, 0x57, + 0xf6, 0x05, 0x05, 0xb5, 0x8c, 0x6e, 0xe9, 0xf7, 0xbc, 0x8e, 0xdd, 0x1d, 0x96, 0x6d, 0x58, 0xe6, + 0xd1, 0x0d, 0x8f, 0xba, 0xfd, 0xe7, 0xb7, 0xdb, 0xf6, 0x52, 0x22, 0x17, 0xe3, 0xcf, 0x0b, 0x7d, + 0x22, 0x89, 0x86, 0x6b, 0x81, 0xec, 0x9a, 0x2f, 0x7e, 0xe4, 0xf1, 0x47, 0xe2, 0x3d, 0xdb, 0xea, + 0x71, 0xc0, 0xf5, 0x74, 0x4c, 0xd3, 0x18, 0xcd, 0x8d, 0xcd, 0x5a, 0x0e, 0x8b, 0x4d, 0xb8, 0x73, + 0xcf, 0x4e, 0x9d, 0xdd, 0x9d, 0x76, 0x74, 0x25, 0xbe, 0x35, 0x7b, 0x3f, 0x2e, 0x15, 0xda, 0x93, + 0x74, 0x47, 0x69, 0x91, 0x5d, 0xf3, 0x41, 0x68, 0x1c, 0xbe, 0x8c, 0xf7, 0xca, 0xfa, 0xcf, 0xb2, + 0x8f, 0x6e, 0xdc, 0x68, 0xaa, 0xd0, 0xfb, 0xed, 0x4d, 0x5b, 0x4c, 0x92, 0xe4, 0xe3, 0x3f, 0x2c, + 0x74, 0x2a, 0x3e, 0x8a, 0xcb, 0x65, 0x75, 0x1c, 0xcb, 0x1e, 0xdc, 0x8b, 0x45, 0x42, 0xbf, 0x49, + 0x5b, 0xcc, 0x48, 0x90, 0x0f, 0xf3, 0xf5, 0x12, 0xbf, 0xf6, 0xea, 0x5d, 0xb8, 0x48, 0x36, 0x96, + 0x63, 0xca, 0xf8, 0x29, 0xee, 0xd7, 0xe4, 0x6e, 0x0b, 0x6c, 0x4a, 0x5b, 0xd0, 0x48, 0x92, 0x2f, + 0xf3, 0xed, 0x4f, 0xe8, 0x78, 0x81, 0xf3, 0x45, 0xce, 0x12, 0x8f, 0x0b, 0xd3, 0x2e, 0xad, 0x22, + 0x36, 0xdb, 0x93, 0xe2, 0xa0, 0xa0, 0x65, 0x9a, 0x3c, 0x58, 0x6f, 0x86, 0xdb, 0x9f, 0xfc, 0x9a, + 0xef, 0x40, 0x3e, 0x67, 0xa2, 0x3d, 0x5e, 0x27, 0xd0, 0x26, 0x32, 0x93, 0xbe, 0x63, 0xba, 0xea, + 0x67, 0x11, 0xee, 0x16, 0x47, 0x9f, 0xad, 0xb6, 0x2f, 0x2c, 0xe8, 0xd7, 0x9a, 0xfd, 0xcc, 0xb5, + 0x7e, 0x5f, 0xe5, 0xbe, 0x32, 0x4b, 0xfd, 0x98, 0xef, 0xd5, 0xf8, 0x82, 0xf1, 0x5e, 0x32, 0x49, + 0xc9, 0x24, 0x91, 0x56, 0x1c, 0x29, 0xd2, 0x0c, 0x82, 0x4a, 0xe1, 0x42, 0xa4, 0x59, 0xa0, 0x07, + 0x7b, 0x44, 0x7a, 0xe8, 0xab, 0x44, 0xde, 0x89, 0x6d, 0x4a, 0x9e, 0xab, 0x84, 0x04, 0x75, 0xe4, + 0x3d, 0x51, 0xb4, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x60, 0xb0, 0xfc, 0x3f, + 0x37, 0x5c, 0xe7, 0x8f, 0x86, 0xf0, 0x6f, 0x57, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pads_reset_unused_xpm[1] = {{ png, sizeof( png ), "pads_reset_unused_xpm" }}; + +//EOF diff --git a/bitmaps_png/include/bitmaps_png/bitmaps_list.h b/bitmaps_png/include/bitmaps_png/bitmaps_list.h index b221d919e8..4b8af49d1e 100644 --- a/bitmaps_png/include/bitmaps_png/bitmaps_list.h +++ b/bitmaps_png/include/bitmaps_png/bitmaps_list.h @@ -321,6 +321,10 @@ EXTERN_BITMAP( pad_xpm ) EXTERN_BITMAP( pad_enumerate_xpm ) EXTERN_BITMAP( pad_number_xpm ) EXTERN_BITMAP( pads_mask_layers_xpm ) +EXTERN_BITMAP( pads_remove_xpm ) +EXTERN_BITMAP( pads_remove_unused_xpm ) +EXTERN_BITMAP( pads_remove_unused_keep_bottom_xpm ) +EXTERN_BITMAP( pads_reset_unused_xpm ) EXTERN_BITMAP( pagelayout_load_xpm ) EXTERN_BITMAP( pagelayout_normal_view_mode_xpm ) EXTERN_BITMAP( pagelayout_special_view_mode_xpm ) diff --git a/bitmaps_png/sources/pads_remove.svg b/bitmaps_png/sources/pads_remove.svg new file mode 100644 index 0000000000..08a3cc2643 --- /dev/null +++ b/bitmaps_png/sources/pads_remove.svg @@ -0,0 +1,407 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pads_remove_unused.svg b/bitmaps_png/sources/pads_remove_unused.svg new file mode 100644 index 0000000000..b8351d066c --- /dev/null +++ b/bitmaps_png/sources/pads_remove_unused.svg @@ -0,0 +1,407 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pads_remove_unused_keep_bottom.svg b/bitmaps_png/sources/pads_remove_unused_keep_bottom.svg new file mode 100644 index 0000000000..d935397356 --- /dev/null +++ b/bitmaps_png/sources/pads_remove_unused_keep_bottom.svg @@ -0,0 +1,407 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pads_reset_unused.svg b/bitmaps_png/sources/pads_reset_unused.svg new file mode 100644 index 0000000000..763501e16c --- /dev/null +++ b/bitmaps_png/sources/pads_reset_unused.svg @@ -0,0 +1,406 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/pcb.keywords b/common/pcb.keywords index 2b74fbeabb..88c79408e5 100644 --- a/common/pcb.keywords +++ b/common/pcb.keywords @@ -2,7 +2,7 @@ # This program source code file is part of KiCad, a free EDA CAD application. # # Copyright (C) 2012 CERN. -# Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors. +# Copyright (C) 2019-2020 KiCad Developers, see AUTHORS.txt for contributors. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -134,6 +134,7 @@ island_area_min italic justify keepout +keep_end_layers keep_upright kicad_pcb last_trace_width @@ -204,6 +205,7 @@ rev rect rect_delta reference +remove_unused_layers right rotate roundrect diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 9f564c898b..06e914d67f 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -142,6 +142,8 @@ set( PCBNEW_DIALOGS dialogs/dialog_track_via_properties_base.cpp dialogs/dialog_track_via_size.cpp dialogs/dialog_track_via_size_base.cpp + dialogs/dialog_unused_pad_layers.cpp + dialogs/dialog_unused_pad_layers_base.cpp dialogs/dialog_update_pcb.cpp dialogs/dialog_update_pcb_base.cpp dialogs/panel_display_options.cpp diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 69d15513db..a2eb69ac35 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +95,8 @@ D_PAD::D_PAD( MODULE* parent ) : m_shapesDirty = true; m_effectiveBoundingRadius = 0; + m_RemoveUnconnectedLayer = false; + m_KeepTopBottomLayer = true; } @@ -173,6 +176,45 @@ bool D_PAD::IsFlipped() const } +bool D_PAD::IsPadOnLayer( LSET aLayers ) const +{ + for( auto layer : aLayers.Seq() ) + { + if( IsPadOnLayer( layer ) ) + return true; + } + + return false; +} + + +bool D_PAD::IsPadOnLayer( int aLayer ) const +{ + BOARD* board = GetBoard(); + + if( !board ) + return false; + + /// We don't remove the copper from non-PTH pads + if( GetAttribute() != PAD_ATTRIB_STANDARD ) + return IsOnLayer( static_cast( aLayer ) ); + + /// Heatsink pads always get copper + if( GetProperty() == PAD_PROP_HEATSINK ) + return IsOnLayer( static_cast( aLayer ) ); + + if( !m_RemoveUnconnectedLayer ) + return true; + + /// Plated through hole pads need copper on the top/bottom layers for proper soldering + if( aLayer == F_Cu || aLayer == B_Cu ) + return true; + + return board->GetConnectivity()->IsConnectedOnLayer( this, static_cast( aLayer ), + { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T, PCB_PAD_T } ); +} + + int D_PAD::GetRoundRectCornerRadius() const { return KiROUND( std::min( m_Size.x, m_Size.y ) * m_roundedCornerScale ); diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 5fff15ea38..949ba68bd0 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -502,6 +502,20 @@ public: int GetSubRatsnest() const { return m_SubRatsnest; } void SetSubRatsnest( int aSubRatsnest ) { m_SubRatsnest = aSubRatsnest; } + /** + * Sets the unconnected removal property. If true, the copper is removed on zone fill + * or when specifically requested when the pad is not connected on a layer. This requires + * that there be a through hole. + */ + void SetRemoveUnconnected( bool aSet ) { m_RemoveUnconnectedLayer = aSet; } + bool GetRemoveUnconnected() const { return m_RemoveUnconnectedLayer; } + + /** + * Sets whether we keep the top and bottom connections even if they are not connected + */ + void SetKeepTopBottom( bool aSet ) { m_KeepTopBottomLayer = aSet; } + bool GetKeepTopBottom() const { return m_KeepTopBottomLayer; } + void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector& aList ) override; bool IsOnLayer( PCB_LAYER_ID aLayer ) const override @@ -509,6 +523,9 @@ public: return m_layerMask[aLayer]; } + bool IsPadOnLayer( int aLayer ) const; + bool IsPadOnLayer( LSET aLayers ) const; + bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override; bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override; @@ -678,6 +695,9 @@ private: int m_LengthPadToDie; // Length net from pad to die, inside the package + bool m_RemoveUnconnectedLayer; // If true, the pad copper is removed for layers that are not connected + bool m_KeepTopBottomLayer; // When removing unconnected pads, keep the top and bottom pads + /* * Pad clearances, margins, etc. exist in a hiearchy. If a given level is specified then * the remaining levels are NOT consulted. diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index cbff940922..bea0988245 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -60,6 +61,8 @@ VIA::VIA( BOARD_ITEM* aParent ) : SetViaType( VIATYPE::THROUGH ); m_BottomLayer = B_Cu; SetDrillDefault(); + m_RemoveUnconnectedLayer = false; + m_KeepTopBottomLayer = true; } @@ -163,6 +166,14 @@ void TRACK::GetWidthConstraints( int* aMin, int* aMax, wxString* aSource ) const int VIA::GetMinAnnulus( PCB_LAYER_ID aLayer, wxString* aSource ) const { + if( !IsPadOnLayer( aLayer ) ) + { + if( aSource ) + *aSource = _( "removed annulus" ); + + return 0; + } + const DRC_CONSTRAINT* constraint = GetConstraint( this, nullptr, DRC_RULE_ID_ANNULUS, aLayer, aSource ); @@ -482,6 +493,39 @@ void VIA::SanitizeLayers() } +bool VIA::IsPadOnLayer( LSET aLayers ) const +{ + for( auto layer : aLayers.Seq() ) + { + if( IsPadOnLayer( layer ) ) + return true; + } + + return false; +} + + +bool VIA::IsPadOnLayer( int aLayer ) const +{ + BOARD* board = GetBoard(); + + if( !board ) + return false; + + if( !IsOnLayer( static_cast( aLayer ) ) ) + return false; + + if( !m_RemoveUnconnectedLayer ) + return true; + + if( m_KeepTopBottomLayer && ( aLayer == m_Layer || aLayer == m_BottomLayer ) ) + return true; + + return board->GetConnectivity()->IsConnectedOnLayer( this, static_cast( aLayer ), + { PCB_TRACE_T, PCB_ARC_T, PCB_PAD_T } ); +} + + void TRACK::ViewGetLayers( int aLayers[], int& aCount ) const { // Show the track and its netname on different layers diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index e33632c8eb..c5ca09d99d 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -337,7 +337,7 @@ public: virtual void SwapData( BOARD_ITEM* aImage ) override; private: - wxPoint m_Mid; ///< Arc mid point, halfway between start and end + wxPoint m_Mid; ///< Arc mid point, halfway between start and end }; @@ -441,6 +441,33 @@ public: int GetMinAnnulus( PCB_LAYER_ID aLayer, wxString* aSource ) const; + /** + * Sets the unconnected removal property. If true, the copper is removed on zone fill + * or when specifically requested when the via is not connected on a layer. + */ + void SetRemoveUnconnected( bool aSet ) { m_RemoveUnconnectedLayer = aSet; } + bool GetRemoveUnconnected() const { return m_RemoveUnconnectedLayer; } + + /** + * Sets whether we keep the top and bottom connections even if they are not connected + */ + void SetKeepTopBottom( bool aSet ) { m_KeepTopBottomLayer = aSet; } + bool GetKeepTopBottom() const { return m_KeepTopBottomLayer; } + + /** + * Checks to see whether the via should have a pad on the specific layer + * @param aLayer Layer to check for connectivity + * @return true if connected by pad or track + */ + bool IsPadOnLayer( int aLayer ) const; + + /** + * Checks to see if the via is present on any of the layers in the set + * @param aLayers set of layers to check the via against + * @return true if connected by pad or track on any of the associated layers + */ + bool IsPadOnLayer( LSET aLayers ) const; + /** * Function SetDrill * sets the drill value for vias. @@ -483,7 +510,10 @@ private: VIATYPE m_ViaType; // Type of via - int m_Drill; // for vias: via drill (- 1 for default value) + int m_Drill; // for vias: via drill (- 1 for default value) + + bool m_RemoveUnconnectedLayer; ///< Remove unconnected copper on a via + bool m_KeepTopBottomLayer; ///< Keep the top and bottom annular rings }; diff --git a/pcbnew/connectivity/connectivity_algo.h b/pcbnew/connectivity/connectivity_algo.h index efd6d5f41a..6f79ab3e6b 100644 --- a/pcbnew/connectivity/connectivity_algo.h +++ b/pcbnew/connectivity/connectivity_algo.h @@ -124,8 +124,6 @@ public: using CLUSTERS = std::vector; -private: - class ITEM_MAP_ENTRY { public: @@ -156,6 +154,8 @@ private: std::list m_items; }; +private: + CN_LIST m_itemList; std::unordered_map m_itemMap; diff --git a/pcbnew/connectivity/connectivity_data.cpp b/pcbnew/connectivity/connectivity_data.cpp index a71f128343..3348de0ade 100644 --- a/pcbnew/connectivity/connectivity_data.cpp +++ b/pcbnew/connectivity/connectivity_data.cpp @@ -326,6 +326,26 @@ void CONNECTIVITY_DATA::PropagateNets() m_connAlgo->PropagateNets(); } +bool CONNECTIVITY_DATA::IsConnectedOnLayer( const BOARD_CONNECTED_ITEM *aItem, int aLayer, + std::vector aTypes ) const +{ + CN_CONNECTIVITY_ALGO::ITEM_MAP_ENTRY &entry = m_connAlgo->ItemEntry( aItem ); + + for( auto citem : entry.GetItems() ) + { + for( auto connected : citem->ConnectedItems() ) + { + if( connected->Valid() && connected->Layers().Overlaps( aLayer ) + && ( aTypes.empty() + || std::count( aTypes.begin(), aTypes.end(), + connected->Parent()->Type() ) > 0 ) ) + return true; + } + } + + return false; +} + unsigned int CONNECTIVITY_DATA::GetUnconnectedCount() const { diff --git a/pcbnew/connectivity/connectivity_data.h b/pcbnew/connectivity/connectivity_data.h index 3e3f3f4a79..0b44df6396 100644 --- a/pcbnew/connectivity/connectivity_data.h +++ b/pcbnew/connectivity/connectivity_data.h @@ -173,6 +173,8 @@ public: */ unsigned int GetUnconnectedCount() const; + bool IsConnectedOnLayer( const BOARD_CONNECTED_ITEM* aItem, int aLayer, std::vector aTypes = {} ) const; + unsigned int GetNodeCount( int aNet = -1 ) const; unsigned int GetPadCount( int aNet = -1 ) const; diff --git a/pcbnew/dialogs/dialog_unused_pad_layers.cpp b/pcbnew/dialogs/dialog_unused_pad_layers.cpp new file mode 100644 index 0000000000..3db6b39eb9 --- /dev/null +++ b/pcbnew/dialogs/dialog_unused_pad_layers.cpp @@ -0,0 +1,157 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 CERN + * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 3 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "dialog_unused_pad_layers.h" + +#include +#include +#include +#include +#include +#include + +enum SCOPE : int +{ + SCOPE_VIAS = 0, + SCOPE_PADS = 1 +}; + + +enum PAD_ACTION : int +{ + PAD_ACTION_REMOVE = 0, + PAD_ACTION_RESET +}; + + +DIALOG_UNUSED_PAD_LAYERS::DIALOG_UNUSED_PAD_LAYERS( PCB_BASE_FRAME* aParent, + const PCBNEW_SELECTION& aItems, + COMMIT& aCommit ) + : DIALOG_UNUSED_PAD_LAYERS_BASE( aParent ), + m_frame( aParent ), + m_items( aItems ), + m_commit( aCommit ) +{ + m_StdButtonsOK->SetDefault(); + m_image->SetBitmap( KiBitmap( pads_remove_unused_xpm ) ); + + // Now all widgets have the size fixed, call FinishDialogSettings + FinishDialogSettings(); +} + + +void DIALOG_UNUSED_PAD_LAYERS::syncImages( wxCommandEvent& aEvent ) +{ + if( m_rbAction->GetSelection() == PAD_ACTION_RESET ) + m_image->SetBitmap( KiBitmap( pads_reset_unused_xpm ) ); + else if( m_cbPreservePads->IsChecked() ) + m_image->SetBitmap( KiBitmap( pads_remove_unused_keep_bottom_xpm ) ); + else + m_image->SetBitmap( KiBitmap( pads_remove_unused_xpm ) ); +} + + +void DIALOG_UNUSED_PAD_LAYERS::onScopeChange( wxCommandEvent& aEvent ) +{ + if( m_rbScope->GetSelection() == SCOPE_PADS ) + { + m_cbPreservePads->SetValue( true ); + m_cbPreservePads->Disable(); + } + else + m_cbPreservePads->Enable(); + + syncImages( aEvent ); +} + + +bool DIALOG_UNUSED_PAD_LAYERS::TransferDataFromWindow() +{ + if( m_cbSelectedOnly->IsChecked() ) + { + for( auto item : m_items ) + { + m_commit.Modify( item ); + + if( item->Type() == PCB_VIA_T && m_rbScope->GetSelection() == SCOPE_VIAS ) + { + VIA* via = static_cast( item ); + via->SetRemoveUnconnected( m_rbAction->GetSelection() == PAD_ACTION_REMOVE ); + via->SetKeepTopBottom( m_cbPreservePads->IsChecked() ); + } + + if( item->Type() == PCB_MODULE_T && m_rbScope->GetSelection() == SCOPE_PADS ) + { + MODULE* mod = static_cast( item ); + + for( auto pad : mod->Pads() ) + { + pad->SetRemoveUnconnected( m_rbAction->GetSelection() == PAD_ACTION_REMOVE ); + pad->SetKeepTopBottom( m_cbPreservePads->IsChecked() ); + } + } + + if( item->Type() == PCB_PAD_T && m_rbScope->GetSelection() == SCOPE_PADS ) + { + D_PAD* pad = static_cast( item ); + + pad->SetRemoveUnconnected( m_rbAction->GetSelection() == PAD_ACTION_REMOVE ); + pad->SetKeepTopBottom( m_cbPreservePads->IsChecked() ); + } + } + } + else + { + if( m_rbScope->GetSelection() == SCOPE_PADS ) + { + for( auto item : m_frame->GetBoard()->Modules() ) + { + m_commit.Modify( item ); + MODULE* mod = static_cast( item ); + + for( auto pad : mod->Pads() ) + { + pad->SetRemoveUnconnected( m_rbAction->GetSelection() == PAD_ACTION_REMOVE ); + pad->SetKeepTopBottom( m_cbPreservePads->IsChecked() ); + } + } + } + else + { + for( auto item : m_frame->GetBoard()->Tracks() ) + { + if( item->Type() != PCB_VIA_T ) + continue; + + m_commit.Modify( item ); + VIA* via = static_cast( item ); + via->SetRemoveUnconnected( m_rbAction->GetSelection() == PAD_ACTION_REMOVE ); + via->SetKeepTopBottom( m_cbPreservePads->IsChecked() ); + } + } + } + + m_commit.Push( _( "Set Unused Pad Properties" ) ); + return true; +} diff --git a/pcbnew/dialogs/dialog_unused_pad_layers.fbp b/pcbnew/dialogs/dialog_unused_pad_layers.fbp new file mode 100644 index 0000000000..60b27316b8 --- /dev/null +++ b/pcbnew/dialogs/dialog_unused_pad_layers.fbp @@ -0,0 +1,556 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + dialog_unused_pad_layers_base + 1000 + none + + 1 + DIALOG_UNUSED_PAD_LAYERS_BASE + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + -1,-1 + DIALOG_UNUSED_PAD_LAYERS_BASE + + 602,321 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + DIALOG_SHIM; dialog_shim.h + Unused Pad Layers + + + + + + + m_MainSizer + wxVERTICAL + protected + + 5 + wxEXPAND + 6 + + + bSizer2 + wxHORIZONTAL + none + + 5 + wxEXPAND + 4 + + + bSizer6 + wxVERTICAL + none + + 0 + wxEXPAND + 1 + + + bSizer4 + wxVERTICAL + none + + 5 + + 2 + + + bSizer5 + wxHORIZONTAL + none + + 5 + wxEXPAND + 0 + + 0 + protected + 0 + + + + 5 + wxALL|wxEXPAND|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "&Vias" "&Pads" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Scope + 1 + + 0 + + + 0 + + 1 + m_rbScope + 1 + + + protected + 1 + + Resizable + 0 + 1 + + wxRA_SPECIFY_COLS + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onScopeChange + + + + 5 + wxALL|wxEXPAND|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "&Remove Unused" "Reset &Unused" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Action + 1 + + 0 + + + 0 + + 1 + m_rbAction + 1 + + + protected + 1 + + Resizable + 0 + 1 + + wxRA_SPECIFY_COLS + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + syncImages + + + + 5 + wxEXPAND + 0 + + 0 + protected + 0 + + + + + + 5 + wxEXPAND|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + &Selection only + + 0 + + + 0 + + 1 + m_cbSelectedOnly + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxEXPAND|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + &Keep pads at first and last layers + + 0 + + + 0 + + 1 + m_cbPreservePads + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + syncImages + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline1 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_VERTICAL + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND|wxLEFT|wxRIGHT + 2 + + + bSizer3 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + 0 + protected + 0 + + + + 10 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + Load From Resource; + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_image + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND + 0 + + 0 + protected + 0 + + + + + + + + 5 + wxEXPAND|wxALL + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_StdButtons + protected + + + + + + diff --git a/pcbnew/dialogs/dialog_unused_pad_layers.h b/pcbnew/dialogs/dialog_unused_pad_layers.h new file mode 100644 index 0000000000..341a8151ff --- /dev/null +++ b/pcbnew/dialogs/dialog_unused_pad_layers.h @@ -0,0 +1,55 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 CERN + * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 3 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#ifndef __dialog_remove_unused_pads__ +#define __dialog_remove_unused_pads__ + +#include "dialog_unused_pad_layers_base.h" + +class COMMIT; +class PCB_BASE_FRAME; +class PCBNEW_SELECTION; + +class DIALOG_UNUSED_PAD_LAYERS : public DIALOG_UNUSED_PAD_LAYERS_BASE +{ +public: + DIALOG_UNUSED_PAD_LAYERS( PCB_BASE_FRAME* aParent, + const PCBNEW_SELECTION& aItems, + COMMIT& aCommit ); + +private: + bool TransferDataFromWindow() override; + + bool AcceptOptions(); + + void syncImages( wxCommandEvent& aEvent ) override; + void onScopeChange( wxCommandEvent& aEvent ) override; + + PCB_BASE_FRAME* m_frame; + const PCBNEW_SELECTION& m_items; // List of items to be modified. + COMMIT& m_commit; // An undo record to add any changes to. +}; + +#endif // __dialog_remove_unused_pads__ diff --git a/pcbnew/dialogs/dialog_unused_pad_layers_base.cpp b/pcbnew/dialogs/dialog_unused_pad_layers_base.cpp new file mode 100644 index 0000000000..697bf73b2c --- /dev/null +++ b/pcbnew/dialogs/dialog_unused_pad_layers_base.cpp @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version 3.9.0 Jul 27 2020) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_unused_pad_layers_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_UNUSED_PAD_LAYERS_BASE::DIALOG_UNUSED_PAD_LAYERS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + + m_MainSizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer4; + bSizer4 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer5->Add( 0, 0, 0, wxEXPAND, 5 ); + + wxString m_rbScopeChoices[] = { _("&Vias"), _("&Pads") }; + int m_rbScopeNChoices = sizeof( m_rbScopeChoices ) / sizeof( wxString ); + m_rbScope = new wxRadioBox( this, wxID_ANY, _("Scope"), wxDefaultPosition, wxDefaultSize, m_rbScopeNChoices, m_rbScopeChoices, 1, wxRA_SPECIFY_COLS ); + m_rbScope->SetSelection( 0 ); + bSizer5->Add( m_rbScope, 0, wxALL|wxEXPAND|wxLEFT|wxRIGHT, 5 ); + + wxString m_rbActionChoices[] = { _("&Remove Unused"), _("Reset &Unused") }; + int m_rbActionNChoices = sizeof( m_rbActionChoices ) / sizeof( wxString ); + m_rbAction = new wxRadioBox( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, m_rbActionNChoices, m_rbActionChoices, 1, wxRA_SPECIFY_COLS ); + m_rbAction->SetSelection( 0 ); + bSizer5->Add( m_rbAction, 0, wxALL|wxEXPAND|wxLEFT|wxRIGHT, 5 ); + + + bSizer5->Add( 0, 0, 0, wxEXPAND, 5 ); + + + bSizer4->Add( bSizer5, 2, 0, 5 ); + + m_cbSelectedOnly = new wxCheckBox( this, wxID_ANY, _("&Selection only"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer4->Add( m_cbSelectedOnly, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 ); + + m_cbPreservePads = new wxCheckBox( this, wxID_ANY, _("&Keep pads at first and last layers"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer4->Add( m_cbPreservePads, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 ); + + + bSizer6->Add( bSizer4, 1, wxEXPAND, 0 ); + + + bSizer2->Add( bSizer6, 4, wxEXPAND, 5 ); + + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer2->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); + + wxBoxSizer* bSizer3; + bSizer3 = new wxBoxSizer( wxVERTICAL ); + + + bSizer3->Add( 0, 0, 0, wxEXPAND, 5 ); + + m_image = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer3->Add( m_image, 0, wxALL, 10 ); + + + bSizer3->Add( 0, 0, 0, wxEXPAND, 5 ); + + + bSizer2->Add( bSizer3, 2, wxEXPAND|wxLEFT|wxRIGHT, 5 ); + + + m_MainSizer->Add( bSizer2, 6, wxEXPAND, 5 ); + + m_StdButtons = new wxStdDialogButtonSizer(); + m_StdButtonsOK = new wxButton( this, wxID_OK ); + m_StdButtons->AddButton( m_StdButtonsOK ); + m_StdButtonsCancel = new wxButton( this, wxID_CANCEL ); + m_StdButtons->AddButton( m_StdButtonsCancel ); + m_StdButtons->Realize(); + + m_MainSizer->Add( m_StdButtons, 0, wxEXPAND|wxALL, 5 ); + + + this->SetSizer( m_MainSizer ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_rbScope->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::onScopeChange ), NULL, this ); + m_rbAction->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::syncImages ), NULL, this ); + m_cbPreservePads->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::syncImages ), NULL, this ); +} + +DIALOG_UNUSED_PAD_LAYERS_BASE::~DIALOG_UNUSED_PAD_LAYERS_BASE() +{ + // Disconnect Events + m_rbScope->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::onScopeChange ), NULL, this ); + m_rbAction->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::syncImages ), NULL, this ); + m_cbPreservePads->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UNUSED_PAD_LAYERS_BASE::syncImages ), NULL, this ); + +} diff --git a/pcbnew/dialogs/dialog_unused_pad_layers_base.h b/pcbnew/dialogs/dialog_unused_pad_layers_base.h new file mode 100644 index 0000000000..f675267dc0 --- /dev/null +++ b/pcbnew/dialogs/dialog_unused_pad_layers_base.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version 3.9.0 Jul 27 2020) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include +#include "dialog_shim.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_UNUSED_PAD_LAYERS_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_UNUSED_PAD_LAYERS_BASE : public DIALOG_SHIM +{ + private: + + protected: + wxBoxSizer* m_MainSizer; + wxRadioBox* m_rbScope; + wxRadioBox* m_rbAction; + wxCheckBox* m_cbSelectedOnly; + wxCheckBox* m_cbPreservePads; + wxStaticLine* m_staticline1; + wxStaticBitmap* m_image; + wxStdDialogButtonSizer* m_StdButtons; + wxButton* m_StdButtonsOK; + wxButton* m_StdButtonsCancel; + + // Virtual event handlers, overide them in your derived class + virtual void onScopeChange( wxCommandEvent& event ) { event.Skip(); } + virtual void syncImages( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_UNUSED_PAD_LAYERS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Unused Pad Layers"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 602,321 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_UNUSED_PAD_LAYERS_BASE(); + +}; + diff --git a/pcbnew/drc/drc_clearance_test_functions.cpp b/pcbnew/drc/drc_clearance_test_functions.cpp index 6ea59d40a4..68c121e6a9 100644 --- a/pcbnew/drc/drc_clearance_test_functions.cpp +++ b/pcbnew/drc/drc_clearance_test_functions.cpp @@ -41,6 +41,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS { BOARD_DESIGN_SETTINGS& bds = m_pcb->GetDesignSettings(); + SHAPE_SEGMENT refSeg( aRefSeg->GetStart(), aRefSeg->GetEnd(), aRefSeg->GetWidth() ); PCB_LAYER_ID refLayer = aRefSeg->GetLayer(); LSET refLayerSet = aRefSeg->GetLayerSet(); @@ -268,6 +269,16 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS EDA_RECT inflatedBB = refSegBB; inflatedBB.Inflate( pad->GetBoundingRadius() + m_largestClearance ); + /// We setup the dummy pad to use in case we need to only draw the hole outline rather + /// than the pad itself + D_PAD dummypad( pad->GetParent() ); + dummypad.SetNetCode( pad->GetNetCode() ); + dummypad.SetSize( pad->GetDrillSize() ); + dummypad.SetOrientation( pad->GetOrientation() ); + dummypad.SetShape( pad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG ? PAD_SHAPE_OVAL + : PAD_SHAPE_CIRCLE ); + dummypad.SetPosition( pad->GetPosition() ); + if( !inflatedBB.Contains( pad->GetPosition() ) ) continue; @@ -318,6 +329,10 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS } } + /// Skip checking pad copper when it has been removed + if( !pad->IsPadOnLayer( refLayer ) ) + continue; + int minClearance = aRefSeg->GetClearance( aRefSeg->GetLayer(), pad, &m_clearanceSource ); int actual; diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index d3b74dc2fd..9e3e1bb951 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -1259,6 +1259,17 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const formatLayers( aPad->GetLayerSet() ); + if( aPad->GetAttribute() == PAD_ATTRIB_STANDARD ) + { + if( aPad->GetRemoveUnconnected() ) + { + m_out->Print( 0, " (remove_unused_layers)" ); + + if( aPad->GetKeepTopBottom() ) + m_out->Print( 0, " (keep_end_layers)" ); + } + } + // Output the radius ratio for rounded and chamfered rect pads if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT || aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT) { @@ -1585,6 +1596,14 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const m_out->Print( 0, " (layers %s %s)", m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(), m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() ); + + if( via->GetRemoveUnconnected() ) + { + m_out->Print( 0, " (remove_unused_layers)" ); + + if( via->GetKeepTopBottom() ) + m_out->Print( 0, " (keep_end_layers)" ); + } } else if( aTrack->Type() == PCB_ARC_T ) { diff --git a/pcbnew/kicad_plugin.h b/pcbnew/kicad_plugin.h index 4793155d68..ada312fd5c 100644 --- a/pcbnew/kicad_plugin.h +++ b/pcbnew/kicad_plugin.h @@ -74,7 +74,8 @@ class TEXTE_PCB; //#define SEXPR_BOARD_FILE_VERSION 20200628 // remove visibility settings //#define SEXPR_BOARD_FILE_VERSION 20200724 // Add KIID to module components //#define SEXPR_BOARD_FILE_VERSION 20200807 // Add zone hatch advanced settings -#define SEXPR_BOARD_FILE_VERSION 20200808 // Add properties to modules +//#define SEXPR_BOARD_FILE_VERSION 20200808 // Add properties to modules +#define SEXPR_BOARD_FILE_VERSION 20200809 // Add REMOVE_UNUSED_LAYERS option to vias and THT pads #define CTL_STD_LAYER_NAMES (1 << 0) ///< Use English Standard layer names #define CTL_OMIT_NETS (1 << 1) ///< Omit pads net names (useless in library) diff --git a/pcbnew/menubar_pcb_editor.cpp b/pcbnew/menubar_pcb_editor.cpp index 92638ab596..cf9c038929 100644 --- a/pcbnew/menubar_pcb_editor.cpp +++ b/pcbnew/menubar_pcb_editor.cpp @@ -484,6 +484,9 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() toolsMenu->AddItem( PCB_ACTIONS::updateFootprints, SELECTION_CONDITIONS::ShowAlways ); toolsMenu->AddItem( PCB_ACTIONS::boardReannotate, SELECTION_CONDITIONS::ShowAlways ); + toolsMenu->AddSeparator(); + toolsMenu->AddItem( PCB_ACTIONS::removeUnusedPads, SELECTION_CONDITIONS::ShowAlways ); + #if defined(KICAD_SCRIPTING_WXPYTHON) auto pythonConsoleShownCondition = [] ( const SELECTION& aSel ) { wxMiniFrame* pythonConsole = (wxMiniFrame *) PCB_EDIT_FRAME::findPythonConsole(); diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 7f79dca228..1d6c0e20cf 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -612,6 +612,11 @@ void PCB_PAINTER::draw( const VIA* aVia, int aLayer ) else radius = aVia->GetWidth() / 2.0; + /// Vias not connected to copper are optionally not drawn + /// We draw instead the hole size to ensure we show the proper clearance + if( IsCopperLayer( aLayer ) && !aVia->IsPadOnLayer( aLayer ) ) + radius = getDrillSize(aVia) / 2.0 ; + bool sketchMode = false; const COLOR4D& color = m_pcbSettings.GetColor( aVia, aLayer ); @@ -696,14 +701,31 @@ void PCB_PAINTER::draw( const VIA* aVia, int aLayer ) void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) { + const D_PAD* pad = aPad; + + /// We setup the dummy pad to use in case we need to only draw the hole outline rather + /// than the pad itself + D_PAD dummypad( aPad->GetParent() ); + dummypad.SetNetCode( aPad->GetNetCode() ); + dummypad.SetSize( aPad->GetDrillSize() ); + dummypad.SetOrientation( aPad->GetOrientation() ); + dummypad.SetShape( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG ? PAD_SHAPE_OVAL + : PAD_SHAPE_CIRCLE ); + dummypad.SetPosition( aPad->GetPosition() ); + + /// Pads not connected to copper are optionally not drawn + /// We draw instead the hole size to ensure we show the proper clearance + if( IsCopperLayer( aLayer ) && !aPad->IsPadOnLayer( aLayer ) ) + pad = &dummypad; + // Draw description layer if( IsNetnameLayer( aLayer ) ) { // Is anything that we can display enabled? if( m_pcbSettings.m_netNamesOnPads || m_pcbSettings.m_padNumbers ) { - bool displayNetname = ( m_pcbSettings.m_netNamesOnPads && !aPad->GetNetname().empty() ); - EDA_RECT padBBox = aPad->GetBoundingBox(); + bool displayNetname = ( m_pcbSettings.m_netNamesOnPads && !pad->GetNetname().empty() ); + EDA_RECT padBBox = pad->GetBoundingBox(); VECTOR2D position = padBBox.Centre(); VECTOR2D padsize = VECTOR2D( padBBox.GetSize() ); @@ -761,7 +783,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) if( displayNetname ) { - wxString netname = UnescapeString( aPad->GetShortNetname() ); + wxString netname = UnescapeString( pad->GetShortNetname() ); // calculate the size of net name text: double tsize = 1.5 * padsize.x / netname.Length(); tsize = std::min( tsize, size ); @@ -776,7 +798,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) if( m_pcbSettings.m_padNumbers ) { - const wxString& padName = aPad->GetName(); + const wxString& padName = pad->GetName(); textpos.y = -textpos.y; double tsize = 1.5 * padsize.x / padName.Length(); tsize = std::min( tsize, size ); @@ -801,10 +823,10 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) // Pad hole color is pad-type-specific: the background color for plated holes and the // pad color for NPTHs. Note the extra check for "should be" NPTHs to keep mis-marked // holes with no annular ring from getting "lost" in the background. - if( ( aLayer == LAYER_PADS_PLATEDHOLES ) && !aPad->PadShouldBeNPTH() ) + if( ( aLayer == LAYER_PADS_PLATEDHOLES ) && !pad->PadShouldBeNPTH() ) color = m_pcbSettings.GetBackgroundColor(); else - color = m_pcbSettings.GetColor( aPad, aLayer ); + color = m_pcbSettings.GetColor( pad, aLayer ); if( m_pcbSettings.m_sketchMode[LAYER_PADS_TH] ) { @@ -825,7 +847,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) // Choose drawing settings depending on if we are drawing a pad itself or a hole if( aLayer == LAYER_PADS_PLATEDHOLES || aLayer == LAYER_NON_PLATEDHOLES ) { - const SHAPE_SEGMENT* seg = aPad->GetEffectiveHoleShape(); + const SHAPE_SEGMENT* seg = pad->GetEffectiveHoleShape(); if( seg->GetSeg().A == seg->GetSeg().B ) // Circular hole m_gal->DrawCircle( seg->GetSeg().A, seg->GetWidth()/2 ); @@ -834,19 +856,19 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) } else { - wxSize pad_size = aPad->GetSize(); + wxSize pad_size = pad->GetSize(); wxSize margin; switch( aLayer ) { case F_Mask: case B_Mask: - margin.x = margin.y = aPad->GetSolderMaskMargin(); + margin.x = margin.y = pad->GetSolderMaskMargin(); break; case F_Paste: case B_Paste: - margin = aPad->GetSolderPasteMargin(); + margin = pad->GetSolderPasteMargin(); break; default: @@ -856,11 +878,11 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) if( margin.x != margin.y ) { - const_cast( aPad )->SetSize( pad_size + margin + margin ); + const_cast( pad )->SetSize( pad_size + margin + margin ); margin.x = margin.y = 0; } - const std::shared_ptr shapes = std::dynamic_pointer_cast( aPad->GetEffectiveShape() ); + const std::shared_ptr shapes = std::dynamic_pointer_cast( pad->GetEffectiveShape() ); if( shapes && shapes->Size() == 1 && shapes->Shapes()[0]->Type() == SH_SEGMENT ) { @@ -875,12 +897,12 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) else { SHAPE_POLY_SET polySet; - aPad->TransformShapeWithClearanceToPolygon( polySet, margin.x ); + pad->TransformShapeWithClearanceToPolygon( polySet, margin.x ); m_gal->DrawPolygon( polySet ); } - if( aPad->GetSize() != pad_size ) - const_cast( aPad )->SetSize( pad_size ); + if( pad->GetSize() != pad_size ) + const_cast( pad )->SetSize( pad_size ); } // Clearance outlines @@ -898,7 +920,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) int clearance = aPad->GetClearance( aPad->GetLayer() ); const std::shared_ptr shapes = - std::dynamic_pointer_cast( aPad->GetEffectiveShape() ); + std::dynamic_pointer_cast( pad->GetEffectiveShape() ); if( shapes && shapes->Size() == 1 && shapes->Shapes()[0]->Type() == SH_SEGMENT ) { @@ -913,7 +935,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) else { SHAPE_POLY_SET polySet; - aPad->TransformShapeWithClearanceToPolygon( polySet, clearance ); + pad->TransformShapeWithClearanceToPolygon( polySet, clearance ); m_gal->DrawPolygon( polySet ); } } diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index e1e1d4109c..f9b96a3502 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -3478,6 +3478,16 @@ D_PAD* PCB_PARSER::parseD_PAD( MODULE* aParent ) } break; + case T_remove_unused_layers: + pad->SetRemoveUnconnected( true ); + NeedRIGHT(); + break; + + case T_keep_end_layers: + pad->SetKeepTopBottom( true ); + NeedRIGHT(); + break; + case T_tstamp: NextTok(); const_cast( pad->m_Uuid ) = m_resetKIIDs ? KIID() : KIID( CurStr() ); @@ -3768,6 +3778,16 @@ VIA* PCB_PARSER::parseVIA() NeedRIGHT(); break; + case T_remove_unused_layers: + via->SetRemoveUnconnected( true ); + NeedRIGHT(); + break; + + case T_keep_end_layers: + via->SetKeepTopBottom( true ); + NeedRIGHT(); + break; + case T_tstamp: NextTok(); const_cast( via->m_Uuid ) = m_resetKIIDs ? KIID() : KIID( CurStr() ); diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index 0e4a123370..01cfcaba03 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -248,6 +248,10 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, continue; } + /// pads not connected to copper are optionally not drawn + if( onCopperLayer && !pad->IsPadOnLayer( aLayerMask ) ) + continue; + COLOR4D color = COLOR4D::BLACK; if( pad->GetLayerSet()[B_Cu] ) @@ -416,6 +420,10 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, int diameter = Via->GetWidth() + 2 * via_margin + width_adj; + /// Vias not connected to copper are optionally not drawn + if( onCopperLayer && !Via->IsPadOnLayer( aLayerMask ) ) + continue; + // Don't draw a null size item : if( diameter <= 0 ) continue; diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index fb4a246954..a8c2a03906 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -693,25 +693,38 @@ std::unique_ptr PNS_KICAD_IFACE_BASE::syncArc( ARC* aArc ) } -std::unique_ptr PNS_KICAD_IFACE_BASE::syncVia( VIA* aVia ) +std::vector> PNS_KICAD_IFACE_BASE::syncVia( VIA* aVia ) { + std::vector> retval; + PCB_LAYER_ID top, bottom; aVia->LayerPair( &top, &bottom ); - std::unique_ptr via( new PNS::VIA( - aVia->GetPosition(), - LAYER_RANGE( top, bottom ), - aVia->GetWidth(), - aVia->GetDrillValue(), - aVia->GetNetCode(), - aVia->GetViaType() ) - ); - via->SetParent( aVia ); + for( int layer = top; layer <= bottom; ++layer ) + { + int width = aVia->GetWidth(); - if( aVia->IsLocked() ) - via->Mark( PNS::MK_LOCKED ); + if( !aVia->IsPadOnLayer( layer ) ) + width = aVia->GetDrillValue(); - return via; + std::unique_ptr via( new PNS::VIA( + aVia->GetPosition(), + LAYER_RANGE( layer ), + width, + aVia->GetDrillValue(), + aVia->GetNetCode(), + aVia->GetViaType() ) + ); + + via->SetParent( aVia ); + + if( aVia->IsLocked() ) + via->Mark( PNS::MK_LOCKED ); + + retval.push_back( std::move( via ) ); + } + + return retval; } @@ -1005,7 +1018,9 @@ void PNS_KICAD_IFACE_BASE::SyncWorld( PNS::NODE *aWorld ) } else if( type == PCB_VIA_T ) { - if( auto via = syncVia( static_cast( t ) ) ) + auto viavec = syncVia( static_cast( t ) ); + + for( auto& via : viavec ) aWorld->Add( std::move( via ) ); } } diff --git a/pcbnew/router/pns_kicad_iface.h b/pcbnew/router/pns_kicad_iface.h index a5e1d672ca..5587d9c8ea 100644 --- a/pcbnew/router/pns_kicad_iface.h +++ b/pcbnew/router/pns_kicad_iface.h @@ -69,7 +69,7 @@ public: return m_world; }; - BOARD* GetBoard() const + BOARD* GetBoard() const { return m_board; } @@ -84,7 +84,7 @@ protected: std::unique_ptr syncPad( D_PAD* aPad ); std::unique_ptr syncTrack( TRACK* aTrack ); std::unique_ptr syncArc( ARC* aArc ); - std::unique_ptr syncVia( VIA* aVia ); + std::vector> syncVia( VIA* aVia ); bool syncTextItem( PNS::NODE* aWorld, EDA_TEXT* aText, PCB_LAYER_ID aLayer ); bool syncGraphicalItem( PNS::NODE* aWorld, DRAWSEGMENT* aItem ); bool syncZone( PNS::NODE* aWorld, ZONE_CONTAINER* aZone ); diff --git a/pcbnew/router/pns_via.h b/pcbnew/router/pns_via.h index b298901feb..ef100981e9 100644 --- a/pcbnew/router/pns_via.h +++ b/pcbnew/router/pns_via.h @@ -67,13 +67,6 @@ public: m_drill = aDrill; m_shape = SHAPE_CIRCLE( aPos, aDiameter / 2 ); m_viaType = aViaType; - - //If we're a through-board via, use all layers regardless of the set passed - if( aViaType == VIATYPE::THROUGH ) - { - LAYER_RANGE allLayers( 0, MAX_CU_LAYERS - 1 ); - SetLayers( allLayers ); - } } diff --git a/pcbnew/tools/global_edit_tool.cpp b/pcbnew/tools/global_edit_tool.cpp index 0d93aa85b7..fba8904ed0 100644 --- a/pcbnew/tools/global_edit_tool.cpp +++ b/pcbnew/tools/global_edit_tool.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2019 KiCad Developers, see AUTHORS.TXT for contributors. + * Copyright (C) 2019-2020 KiCad Developers, see AUTHORS.TXT for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -196,6 +197,22 @@ int GLOBAL_EDIT_TOOL::CleanupGraphics( const TOOL_EVENT& aEvent ) } +int GLOBAL_EDIT_TOOL::RemoveUnusedPads( const TOOL_EVENT& aEvent ) +{ + PCB_EDIT_FRAME* editFrame = getEditFrame(); + PCBNEW_SELECTION& selection = m_selectionTool->RequestSelection( + []( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector ) + { + EditToolSelectionFilter( aCollector, EXCLUDE_TRANSIENTS ); + } ); + DIALOG_UNUSED_PAD_LAYERS dlg( editFrame, selection, *m_commit ); + + dlg.ShowModal(); + + return 0; +} + + void GLOBAL_EDIT_TOOL::setTransitions() { Go( &GLOBAL_EDIT_TOOL::ExchangeFootprints, PCB_ACTIONS::updateFootprint.MakeEvent() ); @@ -210,6 +227,7 @@ void GLOBAL_EDIT_TOOL::setTransitions() Go( &GLOBAL_EDIT_TOOL::GlobalDeletions, PCB_ACTIONS::globalDeletions.MakeEvent() ); Go( &GLOBAL_EDIT_TOOL::CleanupTracksAndVias, PCB_ACTIONS::cleanupTracksAndVias.MakeEvent() ); Go( &GLOBAL_EDIT_TOOL::CleanupGraphics, PCB_ACTIONS::cleanupGraphics.MakeEvent() ); + Go( &GLOBAL_EDIT_TOOL::RemoveUnusedPads, PCB_ACTIONS::removeUnusedPads.MakeEvent() ); } diff --git a/pcbnew/tools/global_edit_tool.h b/pcbnew/tools/global_edit_tool.h index f151aebc87..96236d82a4 100644 --- a/pcbnew/tools/global_edit_tool.h +++ b/pcbnew/tools/global_edit_tool.h @@ -61,6 +61,7 @@ public: int GlobalDeletions( const TOOL_EVENT& aEvent ); int CleanupTracksAndVias( const TOOL_EVENT& aEvent ); int CleanupGraphics( const TOOL_EVENT& aEvent ); + int RemoveUnusedPads( const TOOL_EVENT& aEvent ); private: bool swapBoardItem( BOARD_ITEM* aItem, PCB_LAYER_ID* new_layer ); diff --git a/pcbnew/tools/pcb_actions.cpp b/pcbnew/tools/pcb_actions.cpp index 4517300a24..2a5bea4181 100644 --- a/pcbnew/tools/pcb_actions.cpp +++ b/pcbnew/tools/pcb_actions.cpp @@ -353,6 +353,12 @@ TOOL_ACTION PCB_ACTIONS::updateFootprints( "pcbnew.GlobalEdit.updateFootprints", _( "Update footprints to include any changes from the library" ), reload_xpm ); +TOOL_ACTION PCB_ACTIONS::removeUnusedPads( "pcbnew.GlobalEdit.removeUnusedPads", + AS_GLOBAL, 0, "", + _( "Remove Unused Pads..." ), + _( "Remove or reset the unconnected inner layers on through hole pads and vias" ), + pads_remove_xpm ); + TOOL_ACTION PCB_ACTIONS::changeFootprint( "pcbnew.GlobalEdit.changeFootprint", AS_GLOBAL, 0, "", _( "Change Footprint..." ), _( "Assign a different footprint from the library" ), diff --git a/pcbnew/tools/pcb_actions.h b/pcbnew/tools/pcb_actions.h index 2e4b97ca46..402c997db8 100644 --- a/pcbnew/tools/pcb_actions.h +++ b/pcbnew/tools/pcb_actions.h @@ -303,6 +303,7 @@ public: static TOOL_ACTION changeFootprint; static TOOL_ACTION changeFootprints; static TOOL_ACTION swapLayers; + static TOOL_ACTION removeUnusedPads; static TOOL_ACTION importNetlist; diff --git a/pcbnew/zone_filler.cpp b/pcbnew/zone_filler.cpp index 195a8c9d87..99eab40082 100644 --- a/pcbnew/zone_filler.cpp +++ b/pcbnew/zone_filler.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -635,7 +636,7 @@ void ZONE_FILLER::buildCopperItemClearances( const ZONE_CONTAINER* aZone, PCB_LA { for( D_PAD* pad : module->Pads() ) { - if( !pad->IsOnLayer( aLayer ) ) + if( !pad->IsPadOnLayer( aLayer ) ) { if( pad->GetDrillSize().x == 0 && pad->GetDrillSize().y == 0 ) continue; @@ -678,7 +679,24 @@ void ZONE_FILLER::buildCopperItemClearances( const ZONE_CONTAINER* aZone, PCB_LA { int gap = aZone->GetClearance( aLayer, track ) + extra_margin; - track->TransformShapeWithClearanceToPolygon( aHoles, gap, m_low_def ); + if( track->Type() == PCB_VIA_T ) + { + VIA* via = static_cast( track ); + + if( !via->IsPadOnLayer( aLayer ) ) + { + TransformCircleToPolygon( aHoles, via->GetPosition(), + ( via->GetDrillValue() + 1 ) / 2 + gap, m_low_def ); + } + else + { + via->TransformShapeWithClearanceToPolygon( aHoles, gap, m_low_def ); + } + } + else + { + track->TransformShapeWithClearanceToPolygon( aHoles, gap, m_low_def ); + } } }